qDebug 的使用


qDebug 的使用

 

來源  https://zhuanlan.zhihu.com/p/32637822

小豆君的干貨鋪 發布於 2018-01-04

 

在項目的開發中,當我們調試程序時,最常用的就是打印信息了,Qt為我們提供了非常方便的打印信息類QDebug。

 

大家應該已經很熟練的使用QDebug了,但也許有些地方並沒有注意到,下面小豆君就介紹一下QDebug的一些常用特性。

 

1 qDebug()的最常用法

我們可以使用qDebug像使用std::cout一樣,直接在重定向操作符(<<)后面加上我們的字符串即可。

如:

qDebug() << "Hello" << 123; 

qDebug()還可以打印Qt中的基本類型,例如QString,QByteArray,QDate,QRectF,QVariantHash,QFont等等,關於Qt中的基本類型,大家可以在幫助文檔中搜索關鍵字QMetaType,這里就不列了。

如:

qDebug() << QString("Hello") << QPoint(10, 10); 

以上的用法都必須包含頭文件QDebug

#include <QDebug>

 

2 不包含頭文件,直接使用qDebug()

一般的,每次我們使用qDebug()<<時,都會要求包含頭文件QDebug。如果你是用習慣了C語言中的格式化輸出,那么也可以像下面的做法來輸出打印信息。

#include <QObject> int main(int argc, char *argv[]) { int num = 20; char str[20]="hello world"; qDebug("如果只寫在括號里,是不需要QDebug頭文件的 %d %s", num, str); } 

 

實際qDebug是包含在qlongging.h中的,因為我們的Qt程序,一般都會包含QObject,所以這里的頭文件包含了QObject,從而我們就不必要額外的再添加QDebug頭文件。

 

以上對於只打印字符串等一些臨時性的基本類型信息時,使用這種方法是非常有效的,但是,要記住Qt所支持的基本類型是不可以打印的。

 

3 為自定義類添加qDebug()打印

如果我們想要使用qDebug打印自定義類中的信息時就可以像以下這樣做:

#include <QDebug> class Student { public: Student(const QString& nm){name = nm;} QString getName() const{return name;} private: QString name; }; QDebug operator<<(QDebug debug, const Student &c) { debug << c.getName(); return debug; } int main(int argc, char *argv[]) { Student student("John"); qDebug() << student; } 

首先,自定義了一個類Student,編寫了構造函數和獲取姓名的獲取器。

其次,定義了"<<"操作符,打印名字。

最后,在main函數中創建Student的實例,並用qDebug()打印該實例。

 

4 消除qDebug()打印

qDebug的打印信息,主要是為了方便調試程序時盡快找到bug,所以當我們在發布版本時,需要去掉debug打印,一方面可以加快我們程序的執行速度,另一方面可以減小我們程序的體積。

 

在我做的項目中有很多人是采用加注釋的方法來去掉打印的,雖然這個方法可行,但不是很有效的,如果哪天程序出了bug還需要再把打印信息去掉注釋,這是很麻煩的。當然,將日志分級也是個很不錯的想法。

 

為了解決這個問題,你只需要在你的pro文件里加上一行預定義宏即可。

DEFINES += QT_NO_DEBUG_OUTPUT

 

在你的程序添加上這個宏,重新編譯運行程序,看看你的打印信息是不是都不見了呢,哈哈,這是不是很方便啊,Qt就是這么的懂你。

 

關於qDebug的知識點小豆君就先講到這里吧,熟練掌握以上的知識在我們的項目開發中基本上是夠用了。有興趣的同學,還可以查看qWarning() qCritical() qFatal()這些函數,大概夠和qDebug()類似,這里我就不講了。

 

============= End

 

 

 

 


免責聲明!

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



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