1. 程式人生 > >Qt 關於setStyleSheet,有時間再測試下各種情況

Qt 關於setStyleSheet,有時間再測試下各種情況

Qt 有好用的Qss系統.
但是這和CSS還是有很多不同.
:
QSS語法主要針對的是C++類.基類和派生類之間的關係.當然也包含一些CSS的父子關係
來看看一般情況下的選擇器 我在此把選擇器分為控制元件關聯和繼承關聯. 因為這兩種子類是不同的,所以我把繼承關聯的子類寫成派生類.


型別選擇器:QPushButton  繼承關聯 type
匹配所有QPushButton的例項和其派生類(含派生類的派生類...)的例項。

類選擇器.QPushButton  繼承關聯+層別區分 class  等價於*.QPushButton
匹配所有QPushButton的例項,但不包含其子類,這相當於:*[class~="QPushButton"]
~=的意思是測試一個QStringList型別的屬性是否包含給定的QString
To match a subset of "class" values, each value must be preceded by a ".".

屬性選擇器:QPushButton[flat="false"] 繼承關聯+屬性區分
匹配所有QPushButton屬性flat為false的例項,
屬性分為兩種,靜態的和動態的,靜態屬性是通過Q_PROPERTY()來指定的,動態屬性通過使用setProperty來指定,如:
QLineEdit *nameEdit = new QLineEdit(this); //靜態
nameEdit->setProperty("mandatoryField", true); //動態
如果在設定了qss後Qt屬性改變了,需要重新設定qss來使其生效,可以使用先unset再set qss。
ID選擇器:QPushButton#okButton 繼承關聯+手動區分

對應Qt裡面的object name設定,使用這條CSS之前要先設定對應控制元件的object name為okButton
如:Ok->setObjectName(tr("okButton"));
E#myid : Matches any E element with ID equal to "myid".

通用型別選擇器* 控制元件關聯
代表所有已有的類,會對所有控制元件有效果。

後代選擇器:QDialog QPushButton 控制元件關聯+層別不區分
匹配所有為QDialog後裔(包含兒子 和 兒子的兒子的遞迴)為QPushButton的例項
意思是所有QDialog的子控制元件的子控制元件(可遞迴),只要是QPushButton 就選中.

子選擇器:QDialog > QPushButton 控制元件關聯+層別區分
匹配所有的QDialog直接控制元件QPushButton的例項,不包含兒子的兒子的遞迴。


一些等同情況.
*[lang=fr]  and [lang=fr] are equivalent.
*.warning and .warning are equivalent.
*#myid and #myid are equivalent.
最後:重要的一點.setStyleSheet("...");其實等價於 setStyleSheet("* {...}"); 要小心為上了.

理解了上面這些,Qss其他部分應該比較好理解了.以後再寫.

2012-12-06