Qt5如何将qDebug()语句重定向到Qt Creator 2.6控制台

How does Qt5 redirect qDebug() statements to the Qt Creator 2.6 console

本文关键字:Qt Creator 控制台 重定向 语句 qDebug Qt5      更新时间:2023-10-16

在搜索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();
}