背景:
我正在使用Qt的qInstallMsgHandler()
和qDebug()
,这是一个GUI应用程序。
我的消息处理程序与Qt qtglobal::qInstallMsgHandler()
documentation here中给出的示例消息处理程序相同。
Linux与Windows:
在Linux上,每次调用qDebug()
时,消息都会立即显示给控制台......这很好并且是预期的。
在Windows上,每次调用qDebug()
时,消息都不会显示给控制台。相反,控制台中没有任何内容。然后当应用程序关闭时,所有消息突然显示在控制台中。
问题:
如何修复Windows上的Qt控制台输出(使用qInstallMsgHandler()
和qDebug()
)?
答案 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,则函数不执行任何操作 汇编
(注意:我强调的重点。方括号中的文字是我自己的。)