Qt除錯資訊分類和qDebug 匯出到文

2021-07-07 10:42:37 字數 3085 閱讀 2209

本文主要參考「一去、二三里」的博文

qt之日誌輸出檔案和

qt之日誌輸出視窗以及qt的幫助文件,index"qinstallmessagehandler",並對他們進行了一些分析和優化。

1,"qinstallmessagehandler"的原理,應該是「publisher-subscriber」(發布/訂閱模式),通過該函式將自定義的log輸出函式註冊到qt的框架中,替換qt預設的將log輸出到視窗函式。因此,可以設計成如下形式,在debug模式時,log輸出到控制台,而release模式,log輸出到檔案。

#ifndef

qt_debug

std::ios::out|std::ios::trunc);
qinstallmessagehandler(outputmessage);

//註冊messagehandler

#endif

//qt_debug

2,自定義的log輸出函式「outputmessage」註冊到qt後,是由qt去呼叫的,就像qt輸出日誌到控制台一樣,它會自行處理多執行緒的問題,故在「outputmessage」函式中,無需加鎖(已驗證)。qt幫助文件中的示例就沒有加鎖。

3,自定義的log輸出函式「outputmessage」要求是全域性或類的靜態函式,不能是類的成員函式,stl的functor就不支援類的成員函式。

4,為了避免反覆open/close檔案,可以將檔案定義為全域性變數。在mainwindow的建構函式中進行資源繫結和註冊,見上面的**;在mainwindow的析構函式中,進行close。

關鍵**如下:

#include

"mainwindow.h"

#include

"ui_mainwindow.h"

#include

"workthread.h"

#include

#include

std::ofstream

g_outputdebug;

mainwindow::mainwindow(qwidget

*parent):

qmainwindow(parent),

ui(new

ui::mainwindow)

mainwindow::~mainwindow()

void

mainwindow::on_pushbutton_clicked()

else

}

void

mainwindow::on_pushbutton_2_clicked()

void

mainwindow::outputmessage(qtmsgtype

type,

const

qmessagelogcontext

&context,

const

qstring

&msg)

qstring

context_info=

qstring("file:(%1)

line:(%2)").arg(qstring(context.file)).arg(context.line);

//qstring

current_date_time

=qdatetime::currentdatetime().tostring("yyyy-mm-dd

hh:mm:ss

ddd");

qstring

current_date_time=

qdatetime::currentdatetime().tostring("yyyy-mm-dd

hh:mm:ss");

qstring

current_date=

qstring("(%1)").arg(current_date_time);

std::string

message=

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 可以在正式執行時禁止...