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. https://gitee.com/feiyangqingyun/qtkaifajingyan
  2. https://github.com/feiyangqingyun/qtkaifajingyan