2

背景:

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

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

Linux 与 Windows:

在 Linux 上,每次qDebug()调用消息都会立即显示到控制台......这是好的和预期的。

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

问题:

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

4

1 回答 1

3

在 Windows 上,消息处理程序需要fflush(stderr)fprintf(). 不知道为什么你需要这个额外的fflush()但它有效。


长篇大论:

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

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

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

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


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

在 Windows 下,如果 [您的应用程序] 是控制台应用程序,则将消息发送到控制台;否则 [如果您的应用程序是 GUI 应用程序],[您的消息] 将发送到调试器。如果在编译期间定义了 QT_NO_DEBUG_OUTPUT,则此函数不执行任何操作。

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

于 2013-01-03T14:57:24.933 回答