Qt開發經驗小技巧161-165

語言: CN / TW / HK
  1. 經常有人說Qt垃圾,說用Qt在1毫秒繪製幾千個資料點卡成屎。其實顯示器最高重新整理頻率一般才60幀,1毫秒就繪製一次有意義嗎?不僅顯示器沒重新整理過來,人肉眼也看不過來(有人可能又要擡槓說這是老闆要求的,顯示歸顯示,至於人看不看那是另外一回事,我想說的是顯示不就是給人看的嗎?給程式看可以直接後臺繪製圖片讓程式識別啊沒必要顯示的),程式中要做的應該是儘量降低程式的繪製重新整理頻率到顯示器的頻率(其實一秒鐘30幀都足夠),一次搞多一點的資料一次性繪製(資料量很大還可以考慮重取樣,比如平均值法等,畢竟要考慮顯示器的解析度就那麼大,搞個幾十萬的資料點擠一塊沒啥意思,可以將一整塊區域內的資料點換成一個點),而不是繪製多次,儘管兩種辦法都可以將收到的資料繪製完成,但是效率相差的不是一點點,訊號也是如此,不建議太頻繁的傳送訊號,Qt內部1秒鐘處理訊號的個數也是有限制的,太頻繁高併發的訊號,很可能會丟失或者合併一部分,比如網路請求接收到的學生資訊表,應該是在該應答資料內的所有學生資訊解析完一次性發送,而不是解析一條傳送一條。

  2. Qt提供了N種窗體屬性比如無邊框屬性FramelessWindowHint、不在工作列顯示屬性Tool等,有時候我們需要對視窗的屬性進行動態設定,比如增加一個屬性或者移除一個屬性,Qt5.9以前需要拿到原有的窗體屬性做運算,後面可以用新的方法。

//增加一個無邊框屬性
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
//移除無邊框屬性
setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);

//下面是5.9以後新增的方法
//增加一個無邊框屬性到窗體屬性連結串列
setWindowFlag(Qt::FramelessWindowHint, true);
//從窗體屬性連結串列中移除無邊框屬性
setWindowFlag(Qt::FramelessWindowHint, false);
  1. 如果對窗體設定了固定尺寸,窗體會變得大小不可拉伸,如果需要重新還原可拉伸,必須重新設定最小尺寸和最大尺寸。
setMinimumSize(0, 0);
setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
  1. Qt內建了很多全域性的物件引數可以直接獲取,這樣在使用的時候方便的不要不要的,比如判斷當前滑鼠左鍵還是右鍵可以直接用qApp->mouseButtons(),全域性的滑鼠座標可以用QCursor::pos()。
//在滑鼠右鍵的地方彈出選單,如果選單是QMenu而不是QAction則只能通過下面的方式彈出
if (qApp->mouseButtons() == Qt::RightButton) {
    videoMenu->exec(QCursor::pos());
}

//全域性剪下板
qApp->clipboard();
//頂層控制元件物件集合
qApp->topLevelWidgets()
//當前焦點所在控制元件
qApp->focusWidget()
//當前平臺名稱
qApp->platformName()
//呼叫系統蜂鳴器
qApp->beep()
//列印當前Qt版本資訊
qApp->aboutQt()
//設定全域性的滑鼠樣式
qApp->setOverrideCursor()
//不使用系統的標準顏色字型等
QGuiApplication::setDesktopSettingsAware(bool on);
QApplication app(argc, argv);

//更多的全域性物件屬性等可以查閱 qguiapplication.h 標頭檔案,你會發現新大陸。
  1. Qt對區分不同的編譯器也做了非常細緻的處理。
#pro檔案可以這樣判斷
msvc{}

//程式碼中可以這樣判斷
#ifdef Q_CC_MINGW
//mingw編譯器
#elif Q_CC_MSVC
//msvc編譯器
#endif

//判斷編譯器和編譯器版本
#if defined Q_CC_MSVC && _MSC_VER < 1300
#if defined(Q_CC_GNU) && (__GNUC__ < 4)

//程式碼中判斷ARM平臺
#ifdef QT_ARCH_ARM
//多個條件判斷
#if defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE)

Qt開發經驗開源主頁(持續更新):

  1. http://gitee.com/feiyangqingyun/qtkaifajingyan
  2. http://github.com/feiyangqingyun/qtkaifajingyan