我正在从Eclipse CDT(使用Qt集成插件)转换到QtCreator 2.0,但仍然有一件事让QtCreator感到困扰:
当我在QtCreator中调试时,我没有在Application output tab
内看到我的qDebug消息,直到我停止正在调试的应用程序......然后它们都会立即显示,这对我们来说并不是很有用。< / p>
使用Eclipse,我没有这个问题:在单步执行源代码时遇到qDebug消息正确显示。
我在Windows下使用Eclipse CDT和Qt Creator。我没有在Linux下尝试(现在不是一个选项)。
答案 0 :(得分:12)
虽然不是一个完整的答案,但您可以安装DebugView(如果您在XP计算机上),以便在尝试解决此问题时查看qDebug输出。
另一个解决方案可能被认为是一个黑客,但工作得很好,就是自己简单地劫持调试消息:
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <iostream>
void msgHandler( QtMsgType type, const char* msg )
{
const char symbols[] = { 'I', 'E', '!', 'X' };
QString output = QString("[%1] %2").arg( symbols[type] ).arg( msg );
std::cerr << output.toStdString() << std::endl;
if( type == QtFatalMsg ) abort();
}
int main(int argc, char *argv[])
{
qInstallMsgHandler( msgHandler );
QCoreApplication a(argc, argv);
qDebug() << "Hello world.";
qWarning() << "Uh, oh...";
qCritical() << "Oh, noes!";
qFatal( "AAAAAAAAAH!" );
return a.exec();
}
哪个会输出:
[I] Hello world.
[E] Uh, oh...
[!] Oh, noes!
[X] AAAAAAAAAH!
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
这实际上是对我自己用来将qDebug,qWarning等发送到日志文件的一些代码的修改。
答案 1 :(得分:7)
您无需关闭应用程序即可查看qDebug()
条消息。
在Qt Creator的最底部有一个名为3 - Application output
的标签。 单击该窗口将显示Qt Creator底部的应用程序输出窗口。
在应用程序仍在运行时,一旦它们被调用,该特定窗口将显示qDebug()
消息。
希望它有所帮助。
修改强>
我不确定这是否是一个答案,但它可能是一个很好的有效原因。
来自qDebug()文档,
这些的Qt实现 函数将文本打印到 Unix / X11和Mac下的stderr输出 OS X.使用Windows,如果它是一个控制台 应用程序,文本发送到 安慰;否则,将其发送给 调试器强>
现在Qt Creator没有附加它自己的调试器。
从Qt Creator文档中,我们必须手动安装调试器。由于您使用的是Windows,因此需要手动安装 Windows调试工具。可以找到更多文档here ...
虽然我不习惯Eclipse CDT,我假设可能附加了一个调试器,因此它正确显示调试输出..
由于没有调试器附加到Qt Creator,它可能表现得很奇怪..
试一试..
答案 2 :(得分:2)
添加上述答案..
始终确保以debug
模式构建,而不是release
模式。
作为qDebug()
,仅适用于调试版本。
在我搜索引导我之前,这是我犯的愚蠢错误,我想在其他答案列表中添加这个优点但重要的一点。
答案 3 :(得分:1)
您是否尝试将以下行添加到.pro?
OUTPUT + =控制台
然后你可以输出std :: cout。
答案 4 :(得分:1)
让我告诉你一些事情:
我在linux上开发了一个c ++控制台应用程序。在运行应用程序期间,它正在读取文件并通过打印出一些状态消息开始处理某些逻辑。当我运行该应用程序时,输出正常。所以为了方便调试,我决定像这样运行应用程序:
./a.out |& tee log
此命令将标准输出(可能也是我不记得的标准错误)重定向到名为“log”的文件中。因此,当我使用此选项运行时,我看到它在日志文件中写入与std完全相同,只有这样的位移:
标准输出 - 所需输出
A
operation 1 success
B
operation 2 success
C
operation 3 success
D
operation 4 success
日志文件中的- 带位移的输出(这不正确)
A
B
C
D
operation 1 success
operation 2 success
operation 3 success
operation 4 success
我猜你的问题就是这种问题......我已经看过QDebug并且没有看到任何释放缓冲区的函数(类似于名为flush的操作)。所以我建议你不要在这个小问题上花些时间(我也认为Qt Creator 2.0是作为测试版发布的,它可能看起来像一个bug)并使用以下其中一个:
qFatal()
qCritical()
qWarning()
QMessageBox
我个人使用QMessageBox :: about来调试,因为你可以停止screan并在一个非常有用的地方读取值,而调试器你不能(我的意思是你可以但你看不到当前的状态)您作为调试器的GUI应用程序已经取得了控制权。)
希望有所帮助。答案 5 :(得分:0)
这是一种解决方法,但您可以安装自己的消息处理程序。如果您还没有这样做,请查看文档中的qInstallMsgHandler。
我在使用Qt Creator 2.0和Qt 4.7.0的Ubuntu 9.10上有类似的问题,但在应用程序关闭之前我没有看到stdout输出。就好像缓冲区没有被刷新一样。 打印到stderr会立即显示应用程序输出窗口中的输出。
fprintf(stderr, "Test1 \n"); // Prints immediately
fprintf(stderr, "Test2 \n\r"); // Prints immediately
fprintf(stdout, "Test3 \n"); // Delayed until app termination
fprintf(stdout, "Test4 \n\r"); // Delayed until app termination
qDebug() << "Test6 \n\r"; // Does not print at all
答案 6 :(得分:0)
这些答案都不适合我(Arch linux用户)。这不是试图解释我的麻烦,而是一个有效的.pro文件。我没有使用QT线程循环,纯粹只是一个简单的main()来做东西和存在。我正在使用cout输出:
QT += core
QT -= gui
CONFIG += c++14
TARGET = evo
#CONFIG += console
CONFIG -= app_bundle
#CONFIG += qt
#OUTPUT += console
TEMPLATE = app
SOURCES += main.cpp \
individual.cpp \
node.cpp \
tree.cpp
HEADERS += \
individual.h \
node.h \
tree.h