如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug`)?

Posted

技术标签:

【中文标题】如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug`)?【英文标题】:How do you fix Qt console output on windows (using `qInstallMsgHandler` and `qDebug`)? 【发布时间】:2013-01-03 14:45:22 【问题描述】:

背景:

我正在使用 Qt 的 qInstallMsgHandler()qDebug(),这是一个 GUI 应用程序。

我的消息处理程序与 Qt 的 qtglobal::qInstallMsgHandler() documentation here 中给出的示例消息处理程序相同。

Linux 与 Windows:

在 Linux 上,每次调用 qDebug() 时,消息都会立即显示在控制台上……这很好,也是意料之中的。

在 Windows 上,每次调用 qDebug() 时,消息都不会显示在控制台上。相反,控制台中没有显示任何内容。然后当应用程序关闭时,所有消息都会突然出现在控制台中。

问题:

如何修复 Windows 上的 Qt 控制台输出(使用 qInstallMsgHandler()qDebug())?

【问题讨论】:

【参考方案1】:

在 Windows 上,消息处理程序需要在 fprintf() 之后执行 fflush(stderr) 不知道为什么需要这个额外的 fflush(),但它可以工作。


长篇大论:

我碰巧注意到,在调用 qInstallMsgHandler() 之前,qDebug() 消息实际上确实在每次调用 qDebug() 之后立即出现。

凭直觉,我决定研究 qDebug() 函数。我碰巧在 Windows 上从源代码构建了 Qt,所以我进入了 qDebug() 源代码,发现如果没有消息处理程序,那么他们有一个默认的消息处理程序短 sn-p 代码。这就是这个 sn-p 的本质:

if (handler) 
    (*handler)(msgType, buf);
 else 
    fprintf(stderr, "%s\n", buf);
    fflush(stderr);

我将fflush(stderr) 添加到我的消息处理程序中,现在 qDebug() 消息确实出现了。


Qt 文档中关于 qDebug() 的警告:

在 Windows 下,消息被发送到控制台,如果 [您的应用程序] 是 控制台应用程序;否则 [如果您的应用程序是 GUI 应用程序],[您的消息] 将发送到调试器。这 如果 QT_NO_DEBUG_OUTPUT 在 编译。

(注:重点由我添加。方括号中的文字是我自己的。)

【讨论】:

以上是关于如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug`)?的主要内容,如果未能解决你的问题,请参考以下文章

Qt3中,如何修改标题栏图标

如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit

Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)

Qt简介

如何修复 Windows 10 上的 Android Studio adb 错误?

如何修复 Windows 上的“无法编译依赖项:bcrypt_elixir”错误?