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

时间:2013-01-03 14:45:22

标签: c++ windows qt debugging console

背景:

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

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

Linux与Windows:

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

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

问题:

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

1 个答案:

答案 0 :(得分: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()消息会在它们出现时显示。


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

  

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

(注意:我强调的重点。方括号中的文字是我自己的。)