背景:
我正在使用Qt的qInstallMsgHandler()
和qDebug()
,这是一个GUI应用程序。
我的消息处理程序与Qt的 qtglobal::qInstallMsgHandler()
documentation here中给出的示例消息处理程序相同。
Linux与Windows:
在Linux上,每次调用qDebug()
时,消息都会立即显示在控制台上……这是好的,也是可以预期的。
在Windows上,每次调用qDebug()
时,消息都不会显示在控制台上。相反,控制台中什么也没有显示。然后,当应用程序关闭时,所有消息突然显示在控制台中。
问题:
如何在Windows上修复Qt控制台输出(使用qInstallMsgHandler()
和qDebug()
)?
最佳答案
在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()的警告:
(请注意:重点是我添加的。方括号中的文本是我自己的。)
关于c++ - 如何在Windows上修复Qt控制台输出(使用 `qInstallMsgHandler`和 `qDebug`)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14141104/