c++ - Qt 将输出从 cout 重定向到 qDebug

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

好的,我正在使用 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 输出并将其丢给应用程序输出?

最佳答案

您需要重定向 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;
}

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

qInstallMessageHandler(customMsgHandler);

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

希望对你有帮助

关于c++ - Qt 将输出从 cout 重定向到 qDebug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377336/

相关文章:

visual-studio - 我只能在 HoloLens 上部署 1 个 Unity 应用程序

windows - 使用MinGW静态构建Qt 5.7时如何解决此构建错误?

c++ - 可移植性库/框架

c++ - 移动和编辑时区分项目上的 Qt itemChange 信号

c# - 使用 .NET 编译器以 ARM 架构为目标

c# - 在 VS17 中模拟时,无法让简单的主/详细模式 Xamarin.Forms 应用程序工作

c++ - QVector::append() 显式复制的原因是什么?

user-interface - Qt4:QAbstractTableModel 拖放,不带 MIME

c++ - 没有合适的默认构造函数可用。 (创建子类时)

c++ - 使用 C++ 读取进程本身的标准输出