在上一節中,小豆君給大家介紹了樣式表的基本概念和大致用法。今天我們來詳細了解下樣式表中選擇器的用法。
所謂選擇器,就是指定你所設置的樣式對哪個或哪些控件起作用。
到目前為止,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