QSS 的選擇器
本文連接地址:http://www.qtdebug.com/QSS-Selector.html
選擇器決定了 style sheet 作用于哪些 Widget,QSS 支持?CSS2 定義的所有選擇器。
通用選擇器 *
類型選擇器
類選擇器
ID 選擇器
屬性選擇器
包含選擇器
子元素選擇器
偽類選擇器
Subcontrol 選擇器
很多時候,可以使用不同的選擇器實現相同效果的樣式,使用非常靈活。
通用選擇器 *
*?作為選擇器,作用于所有的 Widget。
類型選擇器
類名?作為選擇器,作用于它自己和它的所有子類。
QFrame {
background: gray;
}
使用了類型選擇器?QFrame,所以 QFrame 和它的子類 QLable,QLCDNumber,QTableWidget 等的背景會是灰色的,QPushButton 不是 QFrame 的子類,所以不受影響:
類選擇器
. + 類名?或者?. + class 的屬性值?作為選擇器,只會作用于它自己,它的子類不受影響。
#include
#include
#include
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
app.setStyleSheet("QWidget { background: gray; }");
QWidget *window = new QWidget();
QPushButton *openButton = new QPushButton("打開", window);
QPushButton *closeButton = new QPushButton("關閉", window);
QPushButton *saveButton = new QPushButton("保存", window);
QHBoxLayout *layout = new QHBoxLayout(window);
layout->addWidget(openButton);
layout->addWidget(closeButton);
layout->addWidget(saveButton);
window->setLayout(layout);
window->show();
return app.exec();
}
window, openButton, closeButton 和 saveButton 的背景都變成灰色的了,如果只想要 window 的背景是灰色的,按鈕的背景不變,可以這么設置
/* 把 QWidget 改成 .QWidget */
app.setStyleSheet(".QWidget {background: gray;}")
如果 openButton 和 closeButton 的背景是洋紅色的,但是 saveButton 不受影響,則可以使用?. + class 的屬性值?作為類選擇器來設置
app.setStyleSheet(".QWidget { background: gray; }"
".QPushButton[level='dangerous'] { background: magenta; }");
// .RedButton 將作為類選擇器
openButton->setProperty("class", "RedButton");
closeButton->setProperty("class", "RedButton");
.QPushButton[level="dangerous"]
.QPushButton[level='dangerous']
.QPushButton[level=dangerous]
ID 選擇器
# + objectName?作為選擇器,只作用于用此 objectName 的對象(多個對象可以使用同一個 objectName,但是不推薦這么做)。如上面的程序, openButton 和 closeButton 的背景是洋紅色的,但是 saveButton 不受影響,也可以使用?ID 選擇器來實現:
app.setStyleSheet(".QWidget { background: gray; }"
"#openButton, #closeButton { background: magenta; }");
// #openButton 和 #closeButton 作為 ID 選擇器
openButton->setObjectName("openButton");
closeButton->setObjectName("closeButton");
屬性選擇器
選擇器[屬性="值"]?作為選擇器,這個屬性可用通過 object->property(propertyName) 訪問的,Qt 里稱為?Dynamic Properties。
如上面的程序, openButton 和 closeButton 的背景是洋紅色的,但是 saveButton 不受影響,也可以使用屬性選擇器 來實現:
app.setStyleSheet(".QWidget { background: gray; }"
"QPushButton[level=\"dangerous\"] { background: magenta; }");
openButton->setProperty("level", "dangerous");
closeButton->setProperty("level", "dangerous");
QSS 會把所有 QPushButton 中 level 屬性值為 dangerous 按鈕的背景繪制為洋紅色,其他按鈕的背景色不受這個 QSS 影響。
包含選擇器
英語叫做?Descendant Selector,descendant 的表達比較到位。
選擇器之間用空格隔開,作用于 Widget 的?子Widget,子Widget 的 子Widget,……,子子孫孫,無窮盡也。
QFrame {
background: gray;
}
QFrame QPushButton {
border: 2px solid magenta;
border-radius: 10px;
background: white;
padding: 2px 15px;
}
頂部的 QPushButton 是 QFrame 的 descendant,所以 QSS 生效了,左下角的 QPushButton 的 parent 是 QWidget,所以 QSS 不起作用:
子元素選擇器
選擇器之間用 > 隔開,作用于 Widget 的直接?子Widget。
QFrame {
background: gray;
}
QFrame > QPushButton {
border: 2px solid magenta;
border-radius: 10px;
background: white;
padding: 2px 15px;
}
按鈕?Child of QGroupBox?的 parent 是 QGroupBox,QGroupBox 的 parent 是 QFrame,所以?Child of QGroupBox?雖然是 QFrame 的?子Widget?的?子Widget,但不是 QFrame 的直接?子Widget,故 QSS 不起作用,而 按鈕?Child of QFrame?的 parent 是 QFrame,所以它的樣式改變了:
偽類選擇器
選擇器:狀態?作為選擇器,支持?!?操作符,表示?非。
QPushButton:hover { color: white }
QCheckBox:checked { color: white }
QCheckBox:!checked { color: red }
鼠標放到 QPushButton 上時,它的文字為白色,QCheckBox 選中時文字為白色,未選中時為紅色。
偽類選擇器還支持鏈式規則:選擇器:狀態1:狀態2:狀態3,狀態之間使用邏輯與,同時滿足條件樣式才生效
QCheckBox:hover:checked { color: white }
鼠標?放到?選中的?QCheckBox 上時,它的字體為白色。
偽類的說明寫成中文怎么感覺都很別扭,慚愧,表達能力欠佳,在此僅作為拋磚引玉吧,更多更詳細的內容請參考 Qt 的幫助文檔,搜索?Qt Style Sheets Reference,查看最下面的?List of Pseudo-States。
當然,這些偽類并不是對任何 Widget 都起作用,例如 QLabel 沒有 :checked 狀態,即使設置了樣式?QLabel:checked {color: red},對 QLabel 也是沒有效果的,只有 Widget 支持某個狀態,那么對應的偽類的樣式才有作用。
Subcontrol 選擇器
選擇器::subcontrol?作為選擇 Subcontrol 的選擇器。
有些 Widget 是由多個部分組合成的,例如 QCheckBox 由 icon(indicator) 和 text 組成,可以使用?選擇器::subcontrol?來設置 subcontrol 的樣式:
QCheckBox::indicator {
width: 20px;
height: 20px;
}
QCheckBox {
spacing: 8px;
}
更多更詳細的內容請參考 Qt 的幫助文檔,搜索?Qt Style Sheets Reference,查看最下面的?List of Sub-Controls。
小程序
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。