在搜索qDebug()语句与Qt的标准消息处理程序正常工作但是当我切换到我自己时失败的原因之后,我在这里呼吁看看是否有其他人对此问题有任何经验。
我知道/已经尝试过的事情,什么都不做......
1)CONFIG += console
2)DEFINES -= QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
3)::fprintf(stderr, "ERROR\n"); ::fflush(stderr);
4)::fprintf(stdout, "OUTPUT\n"); ::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资源中找到它。
答案 0 :(得分:15)
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();
}
答案 1 :(得分:2)
我无法重现您的问题:这对我来说是正常的。
#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): %s\n", 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();
}