QSS 的選擇器

      網友投稿 762 2025-04-01

      本文連接地址: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 {

      QSS 的選擇器

      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小時內刪除侵權內容。

      上一篇:WPS表格技巧—利用公式隔行填充表格的方法(wps表格隔行填充效果)
      下一篇:word轉換excel格式的教程(word格式怎么轉換為excel格式)
      相關文章
      久久精品国产精品亚洲艾| 亚洲精品成人网站在线观看| 亚洲一区二区三区夜色| 国产亚洲精品无码拍拍拍色欲| 亚洲Av永久无码精品黑人| 亚洲男人天堂2018av| 亚洲av无码一区二区三区观看| 亚洲国产精品久久久久婷婷软件| 亚洲无人区一区二区三区| 激情97综合亚洲色婷婷五| 亚洲国产一区二区视频网站| 亚洲A∨精品一区二区三区| 国产精品亚洲а∨无码播放麻豆| 精品亚洲国产成人av| 久久久久久亚洲av无码蜜芽| 亚洲AV成人无码网站| 久久精品国产亚洲AV天海翼| 亚洲精品国产综合久久久久紧| 一本色道久久88—综合亚洲精品| 亚洲国产日韩综合久久精品| 国产精品高清视亚洲一区二区 | 亚洲精品无码久久久久久| 国产成人精品日本亚洲专一区| 亚洲综合亚洲国产尤物| 亚洲福利电影一区二区?| 亚洲精品一区二区三区四区乱码| 自怕偷自怕亚洲精品| 亚洲欧洲国产成人精品| 亚洲色欲色欲www| 亚洲人成综合网站7777香蕉| 亚洲欧洲无码AV不卡在线| 内射无码专区久久亚洲| 亚洲天堂免费在线视频| 亚洲精品无码久久久久sm| 亚洲一区二区成人| 国产成人精品日本亚洲直接| 亚洲国产成人久久综合| 亚洲精品岛国片在线观看| 亚洲日韩小电影在线观看| 91精品国产亚洲爽啪在线观看| 亚洲人成黄网在线观看|