Qt開發經驗小技巧191-195

2021-12-30 19:00:11
  1. 關於QList佇列的處理中,我們最常用的就是呼叫append函數新增item,往前插入item很多人第一印象就是呼叫insert(0,xxx)來插入,其實QList完全提供了往前追加item的函數prepend、push_front。
QStringList list;
list << "aaa" << "bbb" << "ccc";

//往後追加 等價於 append
list.push_back("ddd");
//往前追加 等價於 prepend
list.push_front("xxx");

//往後追加
list.append("ddd");
//往前追加
list.prepend("xxx");

//指定第一個位置插入 等價於 prepend
list.insert(0, "xxx");

//輸出 QList("xxx", "aaa", "bbb", "ccc", "ddd")
qDebug() << list;
  1. Qt內建了一些QList、QMap、QHash相關的型別,可以直接用,不用自己寫個長長的型別。
//qwindowdefs.h
typedef QList<QWidget *> QWidgetList;
typedef QList<QWindow *> QWindowList;
typedef QHash<WId, QWidget *> QWidgetMapper;
typedef QSet<QWidget *> QWidgetSet;

//qmetatype.h
typedef QList<QVariant> QVariantList;
typedef QMap<QString, QVariant> QVariantMap;
typedef QHash<QString, QVariant> QVariantHash;
typedef QList<QByteArray> QByteArrayList;
  1. Qt的佈局的邊距間隔,如果在沒有改動過的情況下,是會根據系統解析度以及縮放比來決定對應的預設值,是變化的,比如在1080P解析度是9px,在2K解析度又變成了11px,所有你會發現你在1080P電腦編譯的程式,明明看到的是6px、9px,怎麼到2K、4K解析度下間隔和邊距就變得好大,如果要保持無論何種解析度都一樣,你需要手動重新設定這些值,這裡有個坑,比如預設是是9,你想其他解析度也是9,你必須先把9改成其他值比如10,然後再改成9,這樣才表示真的改動,你直接9改成9是不會變化的,在屬性設計器中右側有個小箭頭恢復值的,也是灰色,只有加深顯示,並且出現了恢復預設值箭頭,才表示你確實是改過了值。

  2. Qt對高分屏以及dpi縮放的支援越來越成熟,在Qt4時代預設的策略就是跟隨系統的縮放,從Qt5.6開始提供了 AA_EnableHighDpiScaling 的屬性設定開啟高分屏,到了5.14以後還可以指定縮放的策略 HighDpiScaleFactorRoundingPolicy 比如支援浮點數的縮放比而不是之前的整數倍,從Qt6開始預設永遠開啟了 AA_EnableHighDpiScaling 屬性,沒法取消。很多時候我們需要兩種模式,一種就是永遠不應用高分屏及縮放,一種就是自動應用高分屏及縮放。

//永遠不應用高分屏及縮放
int main(int argc, char *argv[])
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    QApplication::setAttribute(Qt::AA_Use96Dpi);
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0))
    QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif

    QApplication a(argc, argv);
    ....
    return a.exec();
}

//自動應用高分屏及縮放
//方法很多,綜合對比下來還是採用組態檔指定縮放策略最適中。
//新建qt.conf檔案放到可執行檔案同一目錄
[Platforms]
WindowsArguments = dpiawareness=0

//有時候想讓使用者去選擇何種策略,需要開啟高分屏的之後只需要將qt.conf檔案放到可執行檔案同一目錄即可,就算程式碼中設定了不應用高分屏及縮放,也無效,也是優先取qt.conf檔案的策略。
  1. 關於QSS要注意的坑。
  • qss源自css,相當於css的一個子集,主要支援的是css2標準,很多網上的css3的標準的寫法在qss這裡是不生效的,所以不要大驚小怪。
  • qss也不是完全支援所有的css2,比如text-align官方檔案就有說明,只支援 QPushButton and QProgressBar,務必看清楚。
  • 有時候偷懶直接來一句 *{xxx},你會發現大部分是應用了,也有小部分或者極個別沒有應用,你可能需要在對應的表單中 this->setStyleSheet() 來設定。
  • qss的執行是有優先順序的,如果沒有指定父物件,則對所有的應用,比如在表單widget中 {color:#ff0000;} 這樣會對widget以及widget的所有子物件應用該樣式,這種問題各大Qt群每週都在上演,你會發現各種奇奇怪怪的異樣不正常,怎麼辦呢,你需要指定類名或者物件名,比如 #widget{color:#ff0000;} 這樣就只會對widget物件應用該樣式,另一種寫法 QWidget#widget{color:#ff0000;},只想對錶單本身而不是子控制元件按鈕標籤等 .QWidget{color:#ff0000;} ,具體詳細規則參見官方說明。
  • qss整體來說還是可以的,儘管有著有那的BUG,懷著包容的心對待它。