如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug`)?
Posted
技术标签:
【中文标题】如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug`)?【英文标题】:How do you fix Qt console output on windows (using `qInstallMsgHandler` and `qDebug`)? 【发布时间】:2013-01-03 14:45:22 【问题描述】:背景:
我正在使用 Qt 的 qInstallMsgHandler()
和 qDebug()
,这是一个 GUI 应用程序。
我的消息处理程序与 Qt 的 qtglobal::qInstallMsgHandler()
documentation here 中给出的示例消息处理程序相同。
Linux 与 Windows:
在 Linux 上,每次调用 qDebug()
时,消息都会立即显示在控制台上……这很好,也是意料之中的。
在 Windows 上,每次调用 qDebug()
时,消息都不会显示在控制台上。相反,控制台中没有显示任何内容。然后当应用程序关闭时,所有消息都会突然出现在控制台中。
问题:
如何修复 Windows 上的 Qt 控制台输出(使用 qInstallMsgHandler()
和 qDebug()
)?
【问题讨论】:
【参考方案1】:在 Windows 上,消息处理程序需要在 fprintf()
之后执行 fflush(stderr)
。 不知道为什么需要这个额外的 fflush()
,但它可以工作。
长篇大论:
我碰巧注意到,在调用 qInstallMsgHandler() 之前,qDebug() 消息实际上确实在每次调用 qDebug() 之后立即出现。
凭直觉,我决定研究 qDebug() 函数。我碰巧在 Windows 上从源代码构建了 Qt,所以我进入了 qDebug() 源代码,发现如果没有消息处理程序,那么他们有一个默认的消息处理程序短 sn-p 代码。这就是这个 sn-p 的本质:
if (handler)
(*handler)(msgType, buf);
else
fprintf(stderr, "%s\n", buf);
fflush(stderr);
我将fflush(stderr)
添加到我的消息处理程序中,现在 qDebug() 消息确实出现了。
Qt 文档中关于 qDebug() 的警告:
在 Windows 下,消息被发送到控制台,如果 [您的应用程序] 是 控制台应用程序;否则 [如果您的应用程序是 GUI 应用程序],[您的消息] 将发送到调试器。这 如果 QT_NO_DEBUG_OUTPUT 在 编译。
(注:重点由我添加。方括号中的文字是我自己的。)
【讨论】:
以上是关于如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug`)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit
Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)