本文主要參考「一去、二三里」的博文
qt之日誌輸出檔案和
qt之日誌輸出視窗以及qt的幫助文件,index"qinstallmessagehandler",並對他們進行了一些分析和優化。
1,"qinstallmessagehandler"的原理,應該是「publisher-subscriber」(發布/訂閱模式),通過該函式將自定義的log輸出函式註冊到qt的框架中,替換qt預設的將log輸出到視窗函式。因此,可以設計成如下形式,在debug模式時,log輸出到控制台,而release模式,log輸出到檔案。
#ifndefqt_debug
std::ios::out|std::ios::trunc);
qinstallmessagehandler(outputmessage);//註冊messagehandler
#endif2,自定義的log輸出函式「outputmessage」註冊到qt後,是由qt去呼叫的,就像qt輸出日誌到控制台一樣,它會自行處理多執行緒的問題,故在「outputmessage」函式中,無需加鎖(已驗證)。qt幫助文件中的示例就沒有加鎖。//qt_debug
3,自定義的log輸出函式「outputmessage」要求是全域性或類的靜態函式,不能是類的成員函式,stl的functor就不支援類的成員函式。
4,為了避免反覆open/close檔案,可以將檔案定義為全域性變數。在mainwindow的建構函式中進行資源繫結和註冊,見上面的**;在mainwindow的析構函式中,進行close。
關鍵**如下:
#include"mainwindow.h"
#include"ui_mainwindow.h"
#include"workthread.h"
#include
#include
std::ofstreamg_outputdebug;
mainwindow::mainwindow(qwidget*parent):
qmainwindow(parent),
ui(newui::mainwindow)
mainwindow::~mainwindow()
voidmainwindow::on_pushbutton_clicked()
else
}
voidmainwindow::on_pushbutton_2_clicked()
voidmainwindow::outputmessage(qtmsgtype
type,
const
qmessagelogcontext
&context,
const
qstring
&msg)
qstringcontext_info=
qstring("file:(%1)
line:(%2)").arg(qstring(context.file)).arg(context.line);
//qstringcurrent_date_time
=qdatetime::currentdatetime().tostring("yyyy-mm-dd
hh:mm:ss
ddd");
qstringcurrent_date_time=
qdatetime::currentdatetime().tostring("yyyy-mm-dd
hh:mm:ss");
qstringcurrent_date=
qstring("(%1)").arg(current_date_time);
std::stringmessage=
qprintable(qstring("%1
%2\t%3
\t%4").arg(text).arg(context_info).arg(current_date).arg(msg));
g_outputdebug<
<<
"\r\n";
}注:
1,將最後的「\r\n」刪除其中乙個,列印資訊之間不會有空行。qtextstream會將「\r\n」識別為乙個換行,而ofstream會分別將『\r''\n'分別識別為乙個換行。
2,末尾句新增「g_ooutputdebug.flush()」實時將快取寫入檔案;
3,最好將該功能新增在main()函式中,檔案的關閉放到事件迴圈結束之後。
4,可以用qtime::currenttime().msec()來將log時間精確到毫秒級。
5,標準c++中,可以定義巨集分隔實現相同功能。關鍵**如下:
#ifndef debug
using std::cout;
#else
using std::ofstream;
ofstream cout;
// 定義全域性檔案流物件,並將檔案流設為與std中的cout同名
#endif
此外,也可以用typedef給std::cout取別名的方式實現。
列印效果如下:
QT 遮蔽qDebug除錯資訊
defines qt no warning output defines qt no debug output c qt qt5.7.0 5.7 msvc2013 include qtcore qlogging.h cpp view plain copy define qt no qdebug ma...
遮蔽qDebug等除錯資訊
defines qt no warning output defines qt no debug output c qt qt5.7.0 5.7 msvc2013 include qtcore qlogging.h define qt no qdebug macro while false qmes...
輸出除錯資訊qDebug的應用
1 基本語法 qdebug 1111111111111111 int i 0 qstring s ss bool bl true qdebug 1111111111111111 d,s,d i,s,bl 布林型輸出的是0或1 在字元介面上執行程式時,會將資訊直接輸出到介面上。2 可以在正式執行時禁止...