Qt樣式表——選擇器詳解(父子關系,插圖詳細解釋)


在上一節中,小豆君給大家介紹了樣式表的基本概念和大致用法。今天我們來詳細了解下樣式表中選擇器的用法。

所謂選擇器,就是指定你所設置的樣式對哪個或哪些控件起作用。

到目前為止,Qt樣式表支持CSS2中定義的所有選擇器。

在講解選擇器之前,小豆君先來介紹下Qt對象樹的一點概念,后面的分享會詳細介紹。

例如下圖,最外層的是QWidget,在QWidget上放置了QFrame,QFrame上又放置了QLabel和QComboBox。那么我們就為這些控件定義了家族關系,若QWidget為父親,則QFrame為QWidget的兒子,QLabel和QComboBox是QWidget的孫子。

 

下面步入正題,新建一個GUI工程QssSelector,基類選擇QWidget,類名QssSelector。

 

1 類型選擇器

使用控件類名作為選擇器

例如:

QPushButton{}

設置QPushButton及其子類的背景顏色為白色。

 

在ui中拖入一個QFrame,再拖入一個QLabel和一個QComboBox到QFrame中

選中QFrame,右鍵“改變樣式表”,輸入如下內容

點擊ok

 

因為只設置了QFrame的背景顏色,所以QFrame的背景顏色被改變,QLabel是控件樹中QFrame的兒子,背景顏色也改變。

 

2 通用選擇器

通用選擇器使用“*”,匹配所有控件。

*{color:blue;}

將剛才的樣式表內容改成如下內容:

點擊ok

所有的控件樣式都改變了。

 

3 組選擇器

如果想要為多種類型的控件設置同樣的樣式,則可以使用組選擇器,類型之間使用逗號隔開

點擊ok

為QLabel和QComboBox設置了樣式

 

4 后代選擇器

有時,用戶希望選擇器匹配控件樹中另一個控件的后代(例如,“匹配由QFrame包含的QComboBox”)。祖先與后代之間用空格隔開。

 

QGroupBox QComboBox{}

QGroupBox是祖先,QComboBox是后代,QComboBox包含在QGroupBox控件中。

 

清空ui,在UI中拖入一個QComboBox和一個QGroupBox,再拖入一個QComboBox到QGroupBox中。

選擇最外層的QWidget,改變樣式表

點擊ok,運行程序

 

設置一般的QComboBox的背景顏色為藍色,但是被QGroupBox包含的QComboBox背景顏色設置成了橘色。因為QComboBox是QGroupBox的后代。

注意 后代選擇器用空格隔開,組選擇器是用逗號隔開。

 

5 子選擇器

如果只想設置某個控件的兒子的樣式,而不是其所有子孫后代,則可以使用子選擇器。父親與兒子之間用大於號“>”隔開。

按下圖拖入控件,這里的控件樹排列順序為QGroupBox是父親,QTabWidget和QComboBox1是兒子 QComboBox2是孫子

 

選擇最外層的QWidget,改變樣式表為

點擊ok

 

因為QComboBox1是QGroupBox的兒子,所以樣式被改變。QComboBox2是QGroupBox的孫子,所以樣式不會被改變。

如果去掉子選擇器(>)則變成了后代選擇器,兩個QComboBox樣式都被改變,因為它們都是QGroupBox的后代。

 

后代選擇器和子選擇器的區別相信大家弄清楚了吧。

 

6 屬性選擇器

屬性選擇符有四種匹配方式,屬性值必須是標識符或字符串:

屬性匹配[att]

當控件設置“att”屬性時匹配,無論該屬性的值是多少。

 

完全匹配[att = val]

當控件的“att”屬性值完全為“val”時匹配。

 

部分值匹配[att ~ = val]

當控件的“att”屬性值是空格分隔的“單詞”列表時,其中一個就是“val”時就可匹配。如果使用此選擇器,則該值中的單詞必須不包含空格(因為它們是由空格分隔的)。

 

[att | = val]

當控件的“att”屬性值是一個連字符(“-”)分隔的“單詞”列表時,以“val”開頭。匹配總是從屬性值的開始處開始。

 

清空ui,拖入如下控件,其中第二行的QPushButton的flat屬性設置為true(使用屬性編輯器設置)

 

選擇最外層的QWidget,右鍵改變樣式表

點擊ok

 

重點解釋第三行控件,因為

第一個QLineEdit的屬性值為hello,剛好和qss中的屬性值相等,所以匹配。

第二個QLineEdit的屬性值為helloworld,hello並不是單詞(兩邊沒有空格),與qss中的不相等,所以不匹配。

第三個QLineEdit的屬性值為my hello kity,hello是一個單詞(兩邊有空格),所以匹配。

 

再解釋下第四行,凡是等於“my”或以“my-”開頭的都會匹配。

 

7 動態屬性選擇器

Qt中的動態屬性也可以作為選擇器。

例如,當填寫一個表單時,為了向用戶表明該字段是強制性的,一個有效的解決方案是使用黃色作為這些字段的背景顏色。

清空ui,拖入如下控件,QLineEdit分別命名為lineEdit_user, lineEdit_passwd, lineEdit_describe

在QssSelector的構造函數中輸入如下代碼

 

編譯運行程序

 

需要用戶必須填寫的內容就被設置成了黃色背景。

 

8 點號類型選擇器

點號選擇器類似於屬性選擇器的“[att~=val]”,例如

.QPushButton等同於*[class~="QPushButton"]

 

9 id選擇器

如果只想為某個單一的控件設置樣式,則可以使用id選擇器,“#”號后面跟上這個控件的ObjectName即可。

QPushButton#okButton

再在之前的ui中拖入兩個QPushButton,並修改objectName為okButton和cancelButton

再在構造函數中,輸入如下代碼:

 

運行程序,指定的ok按鈕變成了淺藍色

 

 

好了,終於寫完了,關於選擇器的內容全都在這兒了,這些知識已足夠大家在項目中使用啦,如果忘記了,直接打開小豆君的文章就行啦,最后多給咱來幾個贊吧(〃'▽'〃)。

 

更多干貨,可關注公眾號:小豆君,關注后還可申請加入C++\Qt交流群,一起學習。

https://zhuanlan.zhihu.com/p/34555751


免責聲明!

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



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