輸出重定向至文件: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