亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何重定向qDebug,qWarning,qCritical等輸出?

如何重定向qDebug,qWarning,qCritical等輸出?

C++
紅糖糍粑 2019-10-28 14:18:22
我在qDebug() <<調試輸出中使用了很多語句。有什么跨平臺的方法可以將調試輸出重定向到文件,而無需使用Shell腳本?我猜想open()和dup2()將在Linux中完成這項工作,但可以在Windows中與MinGW一起編譯嗎?也許有Qt方法可以做到?
查看完整描述

3 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

您必須使用qInstallMsgHandler函數安裝消息處理程序,然后才能QTextStream將調試消息寫入文件中。這是一個示例示例:


#include <QtGlobal>

#include <stdio.h>

#include <stdlib.h>


void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)

{

    QByteArray localMsg = msg.toLocal8Bit();

    switch (type) {

    case QtDebugMsg:

        fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);

        break;

    case QtInfoMsg:

        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);

        break;

    case QtWarningMsg:

        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);

        break;

    case QtCriticalMsg:

        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);

        break;

    case QtFatalMsg:

        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);

        abort();

    }

}


int main(int argc, char **argv)

{

    qInstallMessageHandler(myMessageOutput); // Install the handler

    QApplication app(argc, argv);

    ...

    return app.exec();

}

摘自qInstallMsgHandler(我僅添加了評論)的文檔:


QtMsgHandler qInstallMessageHandler(QtMsgHandler處理程序)

在上面的示例中,該函數myMessageOutput使用stderr了您可能希望用其他文件流替換的函數,或者完全重寫了該函數!


一旦你寫并安裝此功能,您所有的qDebug(以及qWarning,qCritical等)消息將被重定向到你在處理程序寫入文件。


查看完整回答
反對 回復 2019-10-28
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

從這里開始,所有的榮譽都歸于精神。


#include <QApplication>

#include <QtDebug>

#include <QFile>

#include <QTextStream>


void myMessageHandler(QtMsgType type, const QMessageLogContext &, const QString & msg)

{

    QString txt;

    switch (type) {

    case QtDebugMsg:

        txt = QString("Debug: %1").arg(msg);

        break;

    case QtWarningMsg:

        txt = QString("Warning: %1").arg(msg);

    break;

    case QtCriticalMsg:

        txt = QString("Critical: %1").arg(msg);

    break;

    case QtFatalMsg:

        txt = QString("Fatal: %1").arg(msg);

    break;

    }

    QFile outFile("log");

    outFile.open(QIODevice::WriteOnly | QIODevice::Append);

    QTextStream ts(&outFile);

    ts << txt << endl;

}


int main( int argc, char * argv[] )

{

    QApplication app( argc, argv );

    qInstallMessageHandler(myMessageHandler);   

    ...

    return app.exec();

}


查看完整回答
反對 回復 2019-10-28
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

這是一個掛鉤默認消息處理程序的工作示例。


謝謝@Ross Rogers!


// -- main.cpp


// Get the default Qt message handler.

static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = qInstallMessageHandler(0);


void myCustomMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)

{

    // Handle the messages!


    // Call the default handler.

    (*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg);

}


int main(int argc, char *argv[])

{

    qInstallMessageHandler(myCustomMessageHandler);


    QApplication a(argc, argv);


    qDebug() << "Wello Horld!";


    return 0;

}


查看完整回答
反對 回復 2019-10-28
  • 3 回答
  • 0 關注
  • 1005 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號