Qt5如何将qDebug()语句重定向到Qt Creator 2.6控制台
How does Qt5 redirect qDebug() statements to the Qt Creator 2.6 console
在搜索qDebug()语句在Qt的标准消息处理程序中工作正常但在切换到自己的消息处理程序时失败的原因之后,我在这里呼吁看看是否有其他人对这个问题有任何经验。
我知道/已经尝试过的事情,什么也没做...
1) CONFIG += console
2) DEFINES -= QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
3) ::fprintf(stderr, "ERRORn"); ::fflush(stderr);
4) ::fprintf(stdout, "OUTPUTn"); ::fflush(stdout);
5) std::cerr << "CERROR" << std::endl; std::cerr.flush();
但是,当使用内置处理程序时,它可以正常工作(即它将消息打印到 QtCreator 控制台)
int main(int argc, char *argv[]) {
// Use my handler
qInstallMessageHandler(MyCustomLogger);
qDebug() << "Not Printed";
// Use standard handler
qInstallMessageHandler(0);
qDebug() << "Correctly Printed";
// Use my handler again
qInstallMessageHandler(MyCustomLogger);
qDebug() << "Not Printed Again...";
}
最近的测试是使用 WinAPI 命令为自己分配一个控制台,这导致正确的行为,所有输出到 stderr 和 stdout 在我创建的控制台上都可见。 但是,这不是我想要的行为,我希望能够在QtCreator中查看此输出。
关于标准消息处理程序如何打印到调试器的任何想法?我还没有设法在Qt来源中找到它。
正如Frank Osterfeld在他的评论中提到的:
在 Windows 上,qDebug() 使用调试通道,而不是 stderr。
在深入研究QDebug代码和QMessageLogger之后,我找到了答案。方便的WinAPI函数OutputDebugString
。
用法(修改自 peppe):
#include <QApplication>
#include <QtDebug>
#include <QtGlobal>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
void MyMessageOutput(QtMsgType Type, const QMessageLogContext& Context, const QString &Message)
{
OutputDebugString(reinterpret_cast<const wchar_t *>(Message.utf16()));
}
int main(int argc, char **argv)
{
// A GUI application
QApplication app(argc, argv);
// Custom handler
qInstallMessageHandler(myMessageOutput);
qDebug() << "Printed in the console using my message handler in a windows GUI application";
// Default handler
qInstallMessageHandler(0);
qDebug() << "Also printed in the console!";
// Show GUI here
//MainForm *MF = new MainForm();
//MF->show();
return app.exec();
}
我无法重现您的问题:这对我来说是正确的。
#include <QCoreApplication>
#include <QtDebug>
#include <QtGlobal>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
fprintf(stderr, "MESSAGE (%s:%u %s): %sn", context.file, context.line, context.function, localMsg.constData());
fflush(stderr);
}
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
qInstallMessageHandler(myMessageOutput);
qDebug() << "Printed in the console";
qInstallMessageHandler(0);
qDebug() << "Also printed in the console";
return app.exec();
}
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 如何在QT Creator上将QWidget声明为继承类的对象
- 在 QTextEdit 中使用指针或在 Qt-Creator 上使用 connect()
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 使用 Cmake 在 Qt Creator 中显示头文件
- 如何在 CMakeLists.txt Qt Creator 中包含头文件?
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 使用Qt Creator在调试模式下编译一段代码
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- Qt creator语言 - fno-elide-constructors 不起作用
- 如何将Valgrind与Qt Creator一起使用来调试远程应用程序?
- QT Creator将SQLite复制为空数据库
- 如何在QT Creator中手动运行CMake和Run
- 在Qt Creator中应用代码更改的快捷方式是什么?
- Qt Creator在linux mint 64位中找不到CMAKE_CXX_COMPILER编译器
- 为什么 qt-creator 在我用小写字母命名小部件类后无法构建?
- Qt Creator项目打破:"找不到建筑x86_64符号"
- 您将如何在现有的QT Creator GUI项目中实现ROS发布者和订阅者?
- 将OpenBLAS与Qt Creator项目链接