天天看點

QT換膚解決方案QT皮膚開發介紹:檔案的規範性:QSS的一些細節:皮膚檔案的管理

昨天寫了篇自己學習感受的部落格,竟然有人留言,受此鼓勵,趁今天是周末,在寫一篇技術性文檔,但是又不知道寫什麼話題,真的是隻有在寫東西時候,才會知道自己大腦中的這些東西是要整理的,好了廢話不說了,由于這是第一次發技術性文檔,在此聲明下,如果有朋友在閱讀中,發下了錯誤,或者有好的方法,可以聯系交流。

大家好,我是tank,那個來自山裡的程式員,今天聊下QT開發皮膚的一些問題,知識雜碎,就說到哪裡算哪裡吧,望體諒。

開發環境:windows

開發語言:QT5.9+VS2015

主題:QT換膚解決方案

QT皮膚開發介紹:

開發過QT程式的可能都清楚,QT程式的UI使用起來是很簡單的,可以是用QT Designer開發,也可以使用直接寫UI代碼開發,兩種的好處,自己感覺都挺好的,但是無論使用哪一種,要正确使用,特别是在混合使用時候,一定要注意,布局的一些細節,UI的一些細節都可能會最終影響你的互動,

先說個例子,剛接觸QT時候,開發使用了Designer,然後在代碼中也實作了一個函數,明明是綁定A按鈕,但是就是不清楚為什麼會在觸發B按鈕時候也會回執行到這裡,後來才清楚是命名的原因,on_對象名_信号();這樣的寫法是不需要綁定信号的,還有一些邊距的問題,有的是在代碼中寫了setMargin(),在設計器中也設計了,導緻以為不起作用。還有一些QT的UI樣式,有的在designer 中寫,有的在代碼中使用setstylSheet();有的人寫在QSS中,總之,很亂,當更換皮膚時候,才發現有很多小的UI樣式,修改起來不知道去哪找,下面我就說下整理我自己覺得比較合适的皮膚開發維護的思路。

第一步,選擇合适的統一的使用皮膚樣式的方法,

1.直接使用QSS 和圖檔;在代碼中對QSS檔案進行加載,圖檔放在QT項目中的Resource檔案加下。

void setStyle(const QString &style) 
{
    QFile qss(style);
    qss.open(QFile::ReadOnly);
    qApp->setStyleSheet(qss.readAll());
    qss.close();
}
           

代碼中通過讀取QSS檔案即可顯示,可以對不同子產品設計QSS檔案,然後在子產品動态加載時候加載QSS顯示。

2.使用RCC 形式,建立QRC檔案,通過編譯生成RCC檔案,在代碼中加載注冊加載rcc檔案即可。

//RCC檔案生成:
rcc.exe -binary 檔案名.qrc -o QtLoadRcc.rcc

//RCC檔案加載:
QResource::registerResource("檔案名.rcc");

//RCC檔案解除安裝
QResource::unregisterResource("檔案名.rcc");
           

檔案的規範性:

QSS檔案寫法和CSS檔案寫法大緻相同,但是具體内容的實作還是有多中寫法,圖檔的格式也要統一,使用svg格式還是png格式,盡量統一。

我們的項目使用的是RCC這種形式的,不好之處就是修改皮膚後,總要編譯後才可以看到效果,确實不是很友善,但是這樣對于UI的管理還是挺好,最終一個rcc檔案就可以了。

樣式一定要統一解除安裝一個地方,QSS檔案還是代碼中,不要分散,一個QSS檔案寫一個子產品,不要寫在一起,防止書寫錯誤,這樣錯誤對于新手,查原因都需要很長時間,就是不知道為什麼有些UI的樣式顯示出來了。有些沒有加載出來,很有可能是你的QSS檔案中有寫錯的地方。不要在QSS中寫了樣式,在代碼中也設定也樣式,防止樣式無效,特别是在父對象設定了樣式,子對象設定時候一定要注意,不然又莫名的不顯示樣式了,

QSS的一些細節:

1.全局寫在前,有主題顔色的,全局的樣式,一定寫全局樣式,不要一個個設定。

2.image的背景圖檔的設定,選用background-image 還是border-image;還是image;一定要适合自己情況,不然總是說圖示變形。

3.對于邊框的樣式,能夠一行設計的不要用三行。

4.對于一些通過狀态改變的UI,設定屬性去解決,不要寫在代碼裡,見得最多的就是這種寫法,比如,當A時候設定樣式為紅色,當!A時候設定樣式為黑色,要善于使用動态屬性。

void setQss(bool isQss)
{
	isQss ? label->setProperty("labelStatus", "11"): label->setProperty("labelStatus", "22");

	label->style()->unpolish(label);
	label->style()->polish(label);
	label->update();
}
           

5.對絕對位置和相對位置加載圖檔要有所了解。

等,很多細節想不起來了,遇到了自行百度吧,

皮膚檔案的管理

皮膚檔案生成好後,本地儲存多個皮膚檔案還是存放在檔案服務,在使用者切換時候下載下傳更新,這兩種方式都可以。

我們最近項目,采用的是皮膚檔案存放在服務端,因為我們的要求是可以換膚就行,并不是給使用者切換皮膚,是以放在了服務端,如果你的程式就是為了給使用者提供一種切換皮膚的功能體驗,你也可以将檔案保留在本地,這樣起碼速度還是挺快的。

至于我們的皮膚檔案版本怎麼維護?檔案怎麼更新?以及我們程式開發中的更新子產品,日志管理子產品,元件式開發問題,這些有時間在分享出來,今天就寫到這裡。

關于QT的學習,有趣的問題我有時間會總結在這裡,因為我發現學習有幾個過程,複制,學習,使用,了解,總結,沒有總結可能很快你學的東西就又還給了教你的那個人,是以我要好好學習。 争取做一個牛逼的程式員,而不是碼農。

繼續閱讀