【问题标题】:Qt redirect output from cout to qDebugQt 将输出从 cout 重定向到 qDebug
【发布时间】:2014-08-19 06:58:30
【问题描述】:

好的,我正在使用 MSVS 2013 和 Qt(msvc2013+opengl 32bit)

我有用 Qt 和扩展 dll 编写的应用程序主窗口。主应用程序编写 qDebug()。但是扩展 dll 对 qDebug() 一无所知,所以我使用的是 std::cout。我找到了丑陋的解决方案:

void Console()
{
    AllocConsole();
    FILE *pFileCon = NULL;
    pFileCon = freopen("CONOUT$", "w", stdout);

    COORD coordInfo;
    coordInfo.X = 130;
    coordInfo.Y = 900;

    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo);
   SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS);
}

在 main 我调用函数Console() 它在我的窗口附近给了我黑色的控制台。它不是很整洁,我也想按顺序查看事件,但我在应用程序输出和控制台中分别查看它们。

所以问题是:有没有办法从 dll 捕获所有 std::cout 输出并将其扔到应用程序输出?

【问题讨论】:

    标签: c++ visual-studio qt visual-studio-2013


    【解决方案1】:

    你需要重定向 qDebug() 给出的输出。

    static void customMsgHandler(QtMsgType type, const QMessageLogContext &, const QString &message)
    {
      QString txt;
      switch (type) {
      case QtDebugMsg:
        txt = QString("Debug: %1").arg(message);
        break;
      case QtWarningMsg:
        txt = QString("Warning: %1").arg(message);
        break;
      case QtCriticalMsg:
        txt = QString("Critical: %1").arg(message);
        break;
      case QtFatalMsg:
        txt = QString("Fatal: %1").arg(message);
        abort();
      }
    
      QFile outFile("log.txt");
      outFile.open(QIODevice::WriteOnly | QIODevice::Append);
      QTextStream ts(&outFile);
      ts << txt << endl;
    }
    

    然后在main()函数中声明QAplication之后

    qInstallMessageHandler(customMsgHandler);
    

    如果所有 qDebug() 调用都将写入,这将使您成为一个跟踪文件。

    我希望这会有所帮助

    【讨论】:

    • 我认为问题是寻求将std::cout 重定向到qDebug() 的解决方案,而不是如何重定向qDebug()
    猜你喜欢
    • 2016-06-23
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2011-06-24
    • 2015-09-27
    • 2018-03-26
    相关资源
    最近更新 更多