qt之窗口換膚


1、相關文章

Qt 資源系統
qt的moc,uic,rcc命令的使用


2、概要
    畢業兩年了,一直使用的是qt界面庫來開發程序,使用過vs08、10、13等開發工具,並安裝了qt的插件,最近在做客戶端換膚功能,所以就對qt的qrc做了點兒研究,我是一個實干派(可能有點兒虛),相對於看文檔來說。本文開頭我就給出了兩篇博客,這兩篇博客對我理解qrc這個東西有很大的幫助,接下來我就簡單分析下我的理解。

    首先說明下qrc是qt的東西,而不屬於vs,這也很容易證明,那就是vs的工程師不識別qrc文件的,如果需要使用qrc文件,那么是需要我們手動新建一個txt,然后改后綴並添加到vs工程里。添加到vs工程里的qrc文件如果我們要打開它,可以qt自帶的qt resource editor,如圖1所示。而我們使用qrc也有多種方式,本文中會提及到兩種方式(不知道還有第三種沒),一種是把qrc文件使用rcc編譯成qrc_xxx.cpp文件,這個文件以靜態的C++壓縮二進制數組包含了所有圖片和其他資源的數據;另一種是把qrc文件用rcc編譯成rcc二進制文件(rcc -binary r.qrc -o r.rcc).

圖1

3、換膚理解
    鋪墊了qrc的東西后,我先說說我對換膚的理解,可能有失偏頗,但總歸是個人見解,大牛勿噴。
    qt程序換膚,個人理解可以從這兩點來修改:rgb+png,咋一看似乎不能理解,其實也挺好理解,接下來我就說下我自己的換膚過程
rgb替換
    所謂rgb替換就是單純的顏色替換,這個也可能是我們大多數人都會使用的一種換膚。其實原理很簡單,就是把所有的stylesheet描述都拿出來,然后放到一個qss文本文件中,把這個文件添加到qrc文件中,qrc中的內容最終會被編譯成二進制數據供我們程序使用,編譯的方式就是前文中提及到的兩種方式。
加載qss文件並使用到全局代碼如下:

 1 QFile file(filename);
 2 if (!file.open(QFile::ReadOnly))
 3 {
 4     return;
 5 }
 6 
 7 QTextStream in(&file);
 8 
 9 in.setCodec("UTF-8");
10 QString qss = in.readAll();
11 
12 qApp->setStyleSheet(qss);
View Code

    上邊這個方法的參數就是qss文件在qrc中的資源路徑,可以使用該方法隨時進行rgb換膚。

關於rgb換膚,在寫代碼時我也給出了一下建議
1、使用setStyleSheet的過程中不能和邏輯代碼一起
2、每個gui類只使用1次setStyleSheet,所有的設置都盡可能的放在構造函數中,方便以后查找
3、考慮到每個可能需要換膚的widget,都需要使用setObjectName方法為其命名,並且名稱不能和其他控件名稱重復
4、使用setStyleSheet方法時,注意格式,建議格式為:class#objectname{}
    當然了了解qss語法之后,你會發現第四種方式只是比較簡單的類選擇器,如果對qss語法比較熟悉的也可以使用更高級的方式,如圖2所示,是一個qss文件示例

圖2


    說到qss的語法,我這兒給出一個qss的坑:當類屬性發現變化時需要重置qss,qt qss博文中也有相應的說明,雖然這篇博客是我轉的,但是其中有加入我自己的理解。
關於qss風格重置我寫了一下共有方法

1 void ResetStyleSheet(QWidget * widget)
2 {
3     QString sheetStr = widget->styleSheet();
4     widget->setStyleSheet("");
5     widget->setStyleSheet(sheetStr);
6 }

圖片資源替換
圖片資源替換我只給出我自己的測試結論,關於更理論的知識可以參考我給出的第一篇文章
方式1:把qrc打到dll中,這種在使用vs的時候是比較簡單的,只需要把qrc加入到vs工程就可以了。
方法2:把qrc編譯成rcc文件,使用rcc命令:rcc -binary r.qrc -o r.rcc

4、不管是使用哪一種方式,一下四個方法都是很有用的
Q_INIT_RESOURCE(filename);//加載一個qrc文件
Q_CLEANUP_RESOURCE(filename);//清理一個qrc文件,使用vs方式加載的qrc文件,可以使用這種方式清理
QResource::registerResource("filename.rcc");//注冊一個rcc文件,該文件是用qrc文件編譯而成,結果和Q_INIT_RESOURCE一樣
QResource::unregisterResource("filename.rcc");//反注冊一個rcc文件,結果和Q_CLEANUP_RESOURCE一樣

如果您覺得文章不錯,不妨給個 打賞,寫作不易,感謝各位的支持。您的支持是我最大的動力,謝謝!!! 

 

  


很重要--轉載聲明

  1. 本站文章無特別說明,皆為原創,版權所有,轉載時請用鏈接的方式,給出原文出處。同時寫上原作者:朝十晚八 or Twowords
  2. 如要轉載,請原文轉載,如在轉載時修改本文,請事先告知,謝絕在轉載時通過修改本文達到有利於轉載者的目的。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM