Qt開發經驗小技巧236-240

  1. 關於在頭文件中定義函數使用static關鍵字的血的教訓。
  • 有時候我們需要將一些常用函數寫在一個文件中供很多地方調用,如果寫的是 int doxxx{} 這種,在你多個地方引用的時候,肯定會編譯報錯提示 “重複定義” 的錯誤。
  • 此時你需要在函數前面加上static關鍵字,變成 static int doxxx{} 這種,能夠正常編譯和運行,以爲一切萬事大吉,還是我太年輕。
  • 如果僅僅是一個類中在使用,或者函數中沒有靜態變量,也不會出問題,問題就在static修飾的函數在每個引入頭文件的時候都會拷貝一份,導致函數裏面的static靜態變量會重複初始化,這樣就不正確了。
  • 爲了解決這個問題,終極辦法就是在外面套個類,所有的函數和變量放到類中,完美,再也不會睡不着了,真香。
  • 關於C/C++ 中的static關鍵字,建議大家參考這篇文章寫得 https://zhuanlan.zhihu.com/p/37439983,醍醐灌頂。
//文件名 test.h

//下面這個函數 編譯報錯提示 “重複定義”
void test() {}

//下面4個函數在每個引入頭文件的時候都會被拷貝一份
static void test1() {}
inline void test2() {}
static inline void test3() {}
inline static void test4() {}

//保證沒問題的寫法
class tt {
    void test() {}
    static void test1() {}
    inline void test2() {}
    static inline void test3() {}
    inline static void test4() {}
}
  1. 在數據庫查詢中,一般會建立索引以便加快查詢速度,比如常用的條件字段作爲索引字段。但是有些時候如果查詢語句沒寫好,就算where中有索引字段也會引起全表掃描,也就是說根本沒用上索引,這點要積極的避免。
  • 模糊查詢like,全模糊 like '%...%' 和左模糊 like '%...' 無法直接使用索引,右模糊查詢 like '...%' 會使用索引。
  • 查詢條件中含有is null的select語句執行慢,is not null 時永遠不會使用索引,一般數據量大的表不要用is null查詢。
  • 不等於操作符 <> 和 != 會限制索引,引起全表掃描,即使比較的字段上有索引。
  • where子句中比較的兩個條件,一個有索引,一個沒索引,使用or則會引起全表掃描。
  • select count(*) from table 這樣不帶任何條件的count會引起全表掃描。
  • in 和 not in 也要慎用,否則會導致全表掃描,能用 between 就不要用 in。
  • 用 >= 替代 >,比如 高效寫法:select * from table where id >= 4,低效寫法:select * from table where id > 3。
  • 如果表數據量很小,比如就幾千行,請忽略上述警告,加不加索引問題不大,甚至某些時候加索引反而大大增加了數據庫文件的體積,影響更新數據庫的速度。
  1. 由於Qt在不斷的更新換代,各種組件輪子也在增加、拆分、調整等,所以我們在編寫項目的時候,如果有版本兼容的問題,就需要在pro項目文件和代碼文件中做對應的判斷處理。根據多年的經驗總結,一個萬能的辦法就是在pro中增加一個DEFINES標識,然後根據這個DEFINES標識引入對應模塊,最後在代碼中通過#ifdef判斷標識執行對應代碼。經過這樣倒騰幾下你的代碼可以在低版本和高版本編譯運行。
//pro pri 文件
//下面表示主版本>4子版本>6 即版本>=5.7
greaterThan(QT_MAJOR_VERSION, 4) {
greaterThan(QT_MINOR_VERSION, 6) {
DEFINES += qchart
}}

//由於Qt6的發佈以及以後Qt7、Qt8等,光有上面這個判斷是不夠的的
//下面表示Qt主版本>5 即版本>=6.0
greaterThan(QT_MAJOR_VERSION, 5) {
DEFINES += qchart
}

//判斷有定義則導入對應模塊
contains(DEFINES, qchart) {
QT += charts
}

//代碼文件
#ifdef qchart
//要執行的代碼
#endif
  1. 在使用QChart圖表控件的時候,你會發現默認的邊距好大,很多時候我們希望能顯示更多的信息,緊湊型的界面,所以需要設置邊距。
//設置背景區域圓角角度
chart->setBackgroundRoundness(0);
//設置內邊界邊距
chart->setMargins(QMargins(0, 0, 0, 0));
//設置外邊界邊距
chart->layout()->setContentsMargins(0, 0, 0, 0);
  1. Qt內置了數據壓縮和解壓的功能,如果遇到圖片、音頻數據、文件等轉base64傳輸這種,採用qCompress壓縮後大概可以節省30%的數據傳輸量,壓縮性能可觀。前提是雙方都是Qt程序,因爲收到數據的時候還要用qUncompress解壓出來,成對出現的。
//發送的時候壓縮下數據
QByteArray buffer = "...";
buffer = qCompress(buffer);
socket->write(buffer);

//收到數據後務必記得先解壓再使用
QByteArray data = socket->readAll();
data = qUncompress(data);

國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章