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

g.p*_*els 13 c++ console qt stderr qt-creator

在搜索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...";
}
Run Code Online (Sandbox Code Playgroud)

最近的测试是使用WinAPI命令为自己分配一个控制台,这导致正确的行为,所有输出到stderr和stdout在我创建的控制台上都可见.但是,这不是我想要的行为,我希望能够在QtCreator中查看此输出.

有关标准消息处理程序如何打印到调试器的任何想法?我还没有在Qt资源中找到它.

g.p*_*els 15

正如Frank Osterfeld在评论中提到的那样:

在Windows上,qDebug()使用调试通道,而不是stderr.

在深入研究QDebug代码和QMessageLogger后,我找到了答案.方便的WinAPI功能OutputDebugString.

用法(改编自peppe's):

#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();
}
Run Code Online (Sandbox Code Playgroud)