Qt重定向输出从cout到qDebug

Qt redirect output from cout to qDebug

本文关键字:qDebug cout 重定向 输出 Qt      更新时间:2023-10-16

好的,我使用的是MSVS 2013和Qt(msvc2013+opengl 32位)

我有主窗口的应用程序写在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);
}

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

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

您需要重定向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()函数中声明应用程序后

qInstallMessageHandler(customMsgHandler);

这将为您创建一个跟踪文件,所有qDebug()调用都将在该文件上写入。

我希望这对你有帮助