Qt 之 qInstallMessageHandler(輸出詳細日志)


輸出重定向至文件:https://www.cnblogs.com/sggggr/p/12661169.html

簡述
安裝之前已定義的消息處理程序,返回一個指向前一個消息處理程序。

消息處理程序是一個函數,用於打印調試信息、警告信息、嚴重錯誤和致命的錯誤的消息。Qt庫(debug模式)包含成百上千的警告信息打印,當發生內部錯誤時(通常是無效的函數參數)。Qt在release模式下構建還包含這些警告,除非在編譯時設置QT_NO_WARNING_OUTPUT和/或QT_NO_DEBUG_OUTPUT。如果你實現自己的消息處理程序,就可以完全控制這些消息。

缺省的消息處理程序向標准輸出打印消息。如果是一個致命的消息,應用程序就會立即中止。

僅可以定義一個消息處理程序,因為這通常是在應用范圍的基礎上進行的,以控制調試輸出。

調用qInstallMessageHandler(0)可以恢復消息處理程序。

| 版權聲明:一去、二三里,未經博主允許不得轉載。

調試級別
Q包含用於警告和調試文本的全局宏:

qDebug()
調試消息

qInfo()
信息消息

qWarning()
警告消息和可恢復的錯誤

qCritical()
關鍵錯誤和系統錯誤

qFatal()
致命錯誤

如果包含頭文件<QDebug>,就可以將所述qDebug()宏用作一個輸出流。

例如:

qDebug() << "Widget" << widget << "at position" << widget->pos();

Windows中,如果是一個控制台應用程序,文本將被發送到控制台;否則,被發送到調試器。

正常使用

一般情況下,在調試程序的時候,我們會輸出一些調試信息,便於程序跟蹤。

例如:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    // 打印信息
    qDebug("This is a debug message.");
    qWarning("This is a warning message.");
    qCritical("This is a critical message.");
    qFatal("This is a fatal message.");

    ...
    return app.exec();
}

輸出如下:

This is a debug message.
This is a warning message.
This is a critical message.
This is a fatal message.

自定義消息處理

一般情況下,一個大型項目會出現很多這樣類似的調試信息,很不利於查找,因為我們根本不清楚輸出信息所在的文件、函數、行號等信息。

下面,我們來根據需要自定義消息處理程序。

#include <QApplication>
#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(); }
 fflush(stderr);//立即輸出,msvc沒有這句也會立即輸出,但是mingw不會
} int main(int argc, char **argv) { QApplication app(argc, argv); // 安裝消息處理程序  qInstallMessageHandler(myMessageOutput); // 打印信息 qDebug("This is a debug message."); qWarning("This is a warning message."); qCritical("This is a critical message."); qFatal("This is a fatal message."); ... return app.exec(); }

這時,我們不僅可以輸出調試信息,而且可以很直觀、很方便的得到輸出代碼所在的文件、函數、行號等信息。

輸出如下:

Debug: This is a debug message. (..\MessageOutput\main.cpp:90, int __cdecl main(int,char *[]))
Warning: This is a warning message. (..\MessageOutput\main.cpp:91, int __cdecl main(int,char *[]))
Critical: This is a critical message. (..\MessageOutput\main.cpp:92, int __cdecl main(int,char *[]))
Fatal: This is a fatal message. (..\MessageOutput\main.cpp:93, int __cdecl main(int,char *[]))
————————————————
版權聲明:本文為CSDN博主「一去丶二三里」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/liang19890820/article/details/51838096

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM