【问题标题】:QtCreator: qDebug Messages Not ShownQtCreator:未显示 qDebug 消息
【发布时间】:2017-05-16 11:36:51
【问题描述】:

我目前在 Windows 7(64 位,Ultimate)上使用 QT Creator 3.2.1 和 Qt 5.3.2(根据我当前项目的要求)。我目前正在开发一个 GUI 项目

尽管已执行以下操作,但我无法在“应用程序输出”窗口中看到任何 qDebug 消息:

  1. 具有适当的 QDebug 代码
  2. 在调试模式下构建项目
  3. 使用“CONFIG += openssl-linked”“CONFIG += console”作为构建项目的附加参数
  4. 根本没有定义 QT_NO_DEBUG_OUTPUT
  5. 确认我有一个调试器(在安装 QtCreator 期间安装了来自 MinGW 4.8.2 32 位的 GDB)

我可以知道我还应该尝试什么吗?谢谢!

【问题讨论】:

  • 确保您没有打开其他程序来获取输出流,例如 debugview(一次只有一个应用程序接收来自 GUI 应用程序的输出)。您可能还想尝试更新的 Qt Creator 版本(当前为 4.2.0)。
  • 谢谢,我该如何检查呢? (例如,我认为我没有看到任何使用 debugview 的行)。至于使用较新的 Qt Creator,让我看看它是否仍然适用于 Qt 5.3.2...
  • 如何启动程序?是“开始调试”还是“运行”?应用代码中是否有 qInstallMessageHandler 调用?
  • 您应该尝试更新版本的 QTCreator
  • @AlexanderVX:是的,main.cpp中有这样一个调用 qInstallMessageHandler(customMessageHandler);另外,我在启动程序时一直使用“开始调试”

标签: qt qt-creator qdebug


【解决方案1】:

This 在 Arch Linux 上为我做了这件事

Qt creator > Tools > Options > Kits,选择你的kit,找到Environment,点击change并添加:

   QT_ASSUME_STDERR_HAS_CONSOLE=1

现在可以在应用程序输出中打印消息 有类似的东西:

   qDebug() << "User clicked on the button!";

你应该在程序中看到类似这样的东西:

【讨论】:

  • 为什么 qDebug() 消息需要 QT_ASSUME_STDERR_HAS_CONSOLE=1 才能显示在 Qt Creator 上?是否应该将此错误报告给 Qt?
  • @nyanpasu64 比尔·盖茨会说:“我不会称它为“错误”——它是一个特性”;) 除了笑话,Qt Creator 保持精简尽可能。我猜在 Qt6 中或沿途可能会出现一些复选框,以使自定义更容易,例如调试内容或选择 c++ 版本而无需编辑模板等。如果除添加该行之外调试功能无法正常工作,则需要发出错误 - 但它工作正常。
  • 在一些 Linux 发行版(比如我正在使用的 OpenSUSE)上,Qt 调试消息被发送到 journalctl 而不是控制台。也许直接在控制台中运行的 Qt 程序将错误发送到控制台而不是 journalctl,但 Qt Creator 没有被检测为控制台。
  • 谢谢,这在一个 Arch 安装中对我有用,而在另一个(相同的 Qt 版本)中,我不必添加标志来获得控制台输出。
【解决方案2】:

我没有收到任何应该由 qDebug() 在 Qt Creator 中?这可能是什么原因?

通过自定义日志消息处理程序重新定义 Qt 应用程序中的标准 Qt 调试输出是很常见的,但我们仍然可以处理使调试消息到达调试控制台:

// example for custom message handler
void customLogHandler(QtMsgType type, const QMessageLogContext& context,
                      const QString& msg)
{
   // send the data to log file via the other thread
   emit writeToFile(type, context, msg);

   // now output to debugger console
#ifdef Q_OS_WIN
    OutputDebugString(text.toStdWString().c_str());
#else
    std::cerr << text.toStdString() << std::endl;
#endif
}

void main()
{
   // custom handler start
   qInstallMessageHandler(&customLogHandler);

   // other app initializations
}

【讨论】:

  • 谢谢!我在我的项目中也发现了类似的代码,只是它被放在了头文件中。我想知道是否应该将它放回 main.cpp 中。现在我将使用 qInstallMessageHandler(0);因为我想先修复更紧急的错误。
猜你喜欢
  • 2012-08-03
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2016-03-29
  • 2012-07-29
  • 2015-10-22
相关资源
最近更新 更多