背景:

我正在使用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/

10-09 03:38