Qt Style Sheets-樣式表語法

樣式表語法

????????Qt 樣式表術語和語法規則幾乎與 HTML CSS 的相同。如果您已經了解 CSS,您可能可以快速瀏覽此部分。

樣式規則

????????樣式表由一系列樣式規則組成。樣式規則由選擇器和聲明組成。選擇器指定哪些小部件受該規則影響;聲明指定應在小部件上設置哪些屬性。例如:

QPushButton { color: red }

????????在上述樣式規則中,QPushButton?是選擇器,{ color: red }?是聲明。該規則指定?QPushButton?及其子類(例如,MyPushButton)應使用紅色作為其前景色。

????????Qt 樣式表通常不區分大小寫(即?colorColorCOLOR?和?cOloR?指的是相同的屬性)。唯一的例外是類名、對象名?和 Qt 屬性名,它們區分大小寫。

????????多個選擇器可以為同一個聲明指定,使用逗號(,)來分隔選擇器。例如,規則

QPushButton, QLineEdit, QComboBox { color: red }

????????相當于以下這三條規則的序列:

QPushButton { color: red }
QLineEdit { color: red }
QComboBox { color: red }

????????樣式規則的聲明部分是一系列property: value對,括在花括號({})中,并以分號分隔。例如:

QPushButton { color: red; background-color: white }

????????請查看下面的屬性列表部分,以獲取 Qt 控件提供的屬性列表。

選擇器類型

選擇器類型
選擇器示例解釋實例代碼
通用選擇器*匹配所有小部件。
* { background-color: red; }///< 通用選擇器:設置所有控件的背景顏色為紅色

類型選擇器QPushButton匹配?QPushButton?及其子類的實例。
QWidget { background-color: red; }///< 將應用樣式到所有的 QWidget 類型的部件上,將背景顏色設置為紅色。

屬性選擇器QPushButton[flat="false"]

匹配不是扁平的QPushButton實例。您可以使用此選擇器來測試支持QVariant::toString()的任何 Qt屬性(有關詳細信息,請參閱toString()函數文檔)。此外,還支持特殊的class屬性,用于類的名稱。

此選擇器還可用于測試動態屬性。有關使用動態屬性進行自定義的更多信息,請參閱使用動態屬性進行自定義。

與其使用=,您還可以使用~=來測試類型為QStringList的 Qt 屬性是否包含給定的QString。

警告:如果在設置樣式表后 Qt 屬性的值發生更改,可能需要強制重新計算樣式表。實現此目的的一種方法是取消設置樣式表然后再次設置。

QWidget[focus = true] { background-color: red; }///< 當 QWidget 具有 focus 屬性且值為 true 時,應用背景顏色為紅色的樣式。
QPushButton[enabled = false] { color: gray; }///< 當 QPushButton 的 enabled 屬性為 false ,將其文字顏色設置為灰色。

類選擇器.QPushButton

匹配?QPushButton?的實例,但不包括其子類。

這等同于?*[class~="QPushButton"]?。

.QPushButton { background-color: red; color: white; }

id選擇器QPushButton#okButton匹配所有QPushButton實例,其對象名稱為okButton
#include <QApplication>
#include <QPushButton>int main(int argc, char *argv[])
{QApplication a(argc, argv);QPushButton button;button.setObjectName("myButton");button.setStyleSheet("#myButton { color: blue; font-size: 16px; }");button.show();return a.exec();
}

派生類選擇器QDialog QPushButton匹配所有作為QDialog的后代(子節點、孫節點等)的QPushButton實例。
子選擇器QDialog > QPushButton匹配所有作為?QDialog?的直接子元素的?QPushButton?實例。

?子控件

????????對于復雜小部件的樣式設置,有必要訪問小部件的子控件,例如QComboBox的下拉按鈕或QSpinBox的上下箭頭。選擇器可能包含子控件,這使得能夠將規則的應用限制在特定的小部件子控件上。例如:

QComboBox::drop-down { image: url(dropdown.png) }

????????上述規則為所有QComboBox的下拉按鈕設置樣式。盡管雙冒號(::)語法讓人想起 CSS3 偽元素,但 Qt 子控件在概念上與這些不同,并且具有不同的級聯語義。

?????????子控件始終相對于另一個元素(即參考元素)進行定位。此參考元素可以是小部件或另一個子控件。例如,默認情況下,“下拉列表”在“QComboBox”的填充矩形的右上角。默認情況下,“下拉列表”位于“下拉列表”子控件的內容矩形的中心。有關用于設置小部件樣式的子控件及其默認位置,請參閱下面的“可設置樣式的小部件列表”。

????????可使用子控件原點屬性更改要使用的原始矩形。例如,如果我們希望將下拉列表放置在QComboBox的邊距矩形中,而不是默認的填充矩形中,我們可以指定:

QComboBox {margin-right: 20px;
}
QComboBox::drop-down {subcontrol-origin: margin;
}

????????在 Margin 矩形內下拉列表的對齊方式使用子控件位置屬性進行更改。

????????寬度和高度屬性可用于控制子控件的大小。請注意,設置圖像會隱式設置子控件的大小。

?????????相對定位方案(位置:相對),允許子控件的位置偏離其初始位置。例如,當按下QComboBox的下拉按鈕時,我們可能希望內部的箭頭偏移以產生“按下”效果。要實現此目的,我們可以指定:

QComboBox::down-arrow {image: url(down_arrow.png);
}
QComboBox::down-arrow:pressed {position: relative;top: 1px; left: 1px;
}

????????絕對定位方案(位置:絕對)允許子控件的位置和大小相對于參考元素進行更改。

????????一旦定位,它們就與小部件一樣被對待,并且可以使用盒模型進行樣式設置。

????????請查看下面的子控件列表以獲取受支持的子控件列表,以及自定義 QPushButton 的菜單指示器子控件以獲取實際示例。

????????注意:對于復雜的小部件,如QComboBox和QScrollBar,如果自定義了一個屬性或子控件,那么所有其他屬性或子控件也必須進行自定義。

偽狀態

????????選擇器可能包含偽狀態,這些偽狀態表示根據小部件的狀態限制規則的應用。偽狀態出現在選擇器的末尾,中間有一個冒號(:)。例如,當鼠標懸停在QPushButton?上時,以下規則適用:

QPushButton:hover { color: white }

????????偽狀態可以使用感嘆號運算符進行取反。例如,當鼠標未懸停在QRadioButton?上時,以下規則適用:

QRadioButton:!hover { color: red }

????????偽狀態可以鏈接,在這種情況下意味著邏輯“與”。例如,以下規則適用于鼠標懸停在已選中的QCheckBox?上時:

QCheckBox:hover:checked { color: white }

????????否定的偽狀態可能出現在偽狀態鏈中。例如,當鼠標懸停在未按下的QPushButton上時,以下規則適用:

QPushButton:hover:!pressed { color: blue; }

????????如果需要,邏輯或可以使用逗號運算符來表示:

QCheckBox:hover, QCheckBox:checked { color: white }

????????偽狀態可以與子控件組合出現。例如:

QComboBox::drop-down:hover { image: url(dropdown_bright.png) }

????????請查看下面的偽狀態列表部分,以獲取 Qt 小部件提供的偽狀態列表。

沖突解決

????????當多個樣式規則指定相同的屬性但具有不同的值時會產生沖突。考慮以下樣式表:

QPushButton#okButton { color: gray }
QPushButton { color: red }

????????這兩條規則都匹配名為?QPushButton?的實例,稱為?okButton,并且對于?color?屬性存在沖突。為了解決此沖突,我們必須考慮選擇器的特異性。在上述示例中,QPushButton#okButton?被認為比?QPushButton?更具特異性,因為它(通常)指的是單個對象,而不是類的所有實例。

????????同樣,具有偽狀態的選擇器比未指定偽狀態的選擇器更具特異性。因此,以下樣式表指定當鼠標懸停在QPushButton?上時,它應該具有白色文本,否則為紅色文本:

QPushButton:hover { color: white }
QPushButton { color: red }

????????這是個棘手的問題:

QPushButton:hover { color: white }
QPushButton:enabled { color: red }

????????在這里,兩個選擇器具有相同的特異性,因此,如果鼠標在啟用按鈕時懸停在其上,則第二條規則優先。如果在這種情況下我們希望文本為白色,我們可以像這樣重新排列規則:

QPushButton:enabled { color: red }
QPushButton:hover { color: white }

????????或者,我們可以使第一條規則更具體:

QPushButton:hover:enabled { color: white }
QPushButton:enabled { color: red }

????????在與類型選擇器結合時會出現類似的問題。考慮以下示例:

QPushButton { color: red }
QAbstractButton { color: gray }

????????這兩條規則適用于QPushButton實例(因為QPushButton繼承QAbstractButton),并且對于顏色屬性存在沖突。由于QPushButton繼承QAbstractButton,可能會讓人誤以為QPushButtonQAbstractButton更具體。然而,對于樣式表計算,所有類型選擇器具有相同的特異性,最后出現的規則優先。換句話說,顏色被設置為gray對于所有QAbstractButton,包括QPushButton。如果我們確實希望QPushButton具有紅色文本,我們總是可以重新排列規則。

一個選擇器的特異性計算如下:

  1. 計算選擇器(= a)中 ID 屬性的數量
  2. 計算選擇器(= b)中其他屬性和偽類的數量
  3. 計算選擇器(= c)中元素名稱的數量
  4. 忽略偽元素(例如,子控件)。

將三個數字 a - b - c(在一個具有大基數的數字系統中)連接起來會產生特殊性。

示例:

*             {}  /* a=0 b=0 c=0 -> specificity =   0 */
LI            {}  /* a=0 b=0 c=1 -> specificity =   1 */
UL LI         {}  /* a=0 b=0 c=2 -> specificity =   2 */
UL OL+LI      {}  /* a=0 b=0 c=3 -> specificity =   3 */
H1 + *[REL=up]{}  /* a=0 b=1 c=1 -> specificity =  11 */
UL OL LI.red  {}  /* a=0 b=1 c=3 -> specificity =  13 */
LI.red.level  {}  /* a=0 b=2 c=1 -> specificity =  21 */
#x34y         {}  /* a=1 b=0 c=0 -> specificity = 100 */

級聯

????????樣式表可以在QApplication、父部件和子部件上設置。任意部件的有效樣式表是通過合并設置在該部件的祖先(父部件、祖父部件等)上的樣式表以及在QApplication上設置的任何樣式表獲得的。

????????當沖突出現時,小部件自身的樣式表總是優先于任何繼承的樣式表,無論沖突規則的特異性如何。同樣,父部件的樣式表優先于祖父部件的樣式表,等等。

????????其中一個后果是,在小部件上設置樣式規則會自動使其優先于在祖先小部件的樣式表或QApplication樣式表中指定的其他規則。考慮以下示例。首先,我們在QApplication上設置樣式表:

qApp->setStyleSheet("QPushButton { color: white }");

????????然后我們在一個QPushButton對象上設置一個樣式表:

????????QPushButton?上的樣式表強制?QPushButton(以及任何子部件)具有藍色文本,盡管應用程序范圍內的樣式表提供了更具體的規則集。

????????如果我們已經寫了,結果會是一樣的

myPushButton->setStyleSheet("color: blue");

????????只是如果QPushButton有子元素(這不太可能),樣式表對它們將沒有影響。

????????樣式表級聯是一個復雜的主題。請參考CSS2 規范以獲取詳細信息。請注意,Qt 目前尚未實現!important

繼承

????????在經典的 CSS 中,當一個項目的字體和顏色未明確設置時,它會自動從父項繼承。在使用 Qt 樣式表時,一個小部件不會自動從其父部件繼承其字體和顏色設置。

????????例如,考慮在QGroupBox?內的QPushButton?:

qApp->setStyleSheet("QGroupBox { color: red; } ");

????????QPushButton?未設置明確的顏色。因此,它沒有繼承其父QGroupBox的顏色,而是采用了系統顏色。如果我們要為QGroupBox及其子元素設置顏色,可以這樣寫:

qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");

????????相比之下,設置字體并使用QWidget::setFont() 和?QWidget::setPalette() 進行傳播會傳播到子部件。

命名空間中的小部件

????????類型選擇器可用于為特定類型的小部件設置樣式。例如:

class MyPushButton : public QPushButton {// ...
}// ...
qApp->setStyleSheet("MyPushButton { background: yellow; }");

????????Qt 樣式表使用小部件的 QObject::className() 來確定何時應用類型選擇器。當自定義小部件在命名空間內時,QObject::className() 返回?::。這與?子控件?的語法沖突。為了克服這個問題,當對命名空間內的小部件使用類型選擇器時,我們必須將“::”替換為“--”。例如,

namespace ns {class MyPushButton : public QPushButton {// ...}
}// ...
qApp->setStyleSheet("ns--MyPushButton { background: yellow; }");

設置 QObject 屬性

????????從 4.3 及以上版本開始,任何可設計的Q_PROPERTY都可以使用 qproperty-<屬性名稱>語法進行設置。

????????例如:

MyLabel { qproperty-pixmap: url(pixmap.png); }
MyGroupBox { qproperty-titleColor: rgb(100, 200, 100); }
QPushButton { qproperty-iconSize: 20px 20px; }

????????如果屬性引用使用 Q_ENUMS 聲明的枚舉,您應該通過名稱引用其常量,即,不是它們的數值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46108.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ThinkPHP6事件系統使用指南

本文由 ChatMoney團隊出品 在ThinkPHP 6中&#xff0c;事件系統提供了一種優雅的方式來實現解耦和動態響應。你可以通過注冊事件和對應的監聽者來處理各種應用邏輯。 事件注冊 閉包注冊 閉包是最簡單的事件監聽者&#xff0c;可以直接在注冊時定義。 Event::listen("C…

Linux操作系統之多文件管理

makefile: makefile文件用于管理和組織代碼工程的編譯和鏈接,被make工具解析并完成相關動作 make: 工程管理工具 語法: 要生成的文件:依賴的所有文件 時間戳: 編譯文件時,時間戳更新的文件需要重新加入編譯,時間戳沒有改變的不需要重新編譯 app:main.c add.c sub.c …

如何追查一個packet在linux 系統哪里丟失

要想追一個包在系統哪里丟失了&#xff0c; 就要了解 一個應用層的包在送出時 要經歷那些 檢查點 和被丟掉的點。 1. 在傳輸層&#xff0c;如果是 tcp 包 會有contrack 的 buf 的限制 可能會導致 packets 的丟失。 > 檢查辦法&#xff1a;查看dmesg日志有報錯&#xff1a;k…

MySQL數據庫慢查詢日志、SQL分析、數據庫診斷

1 數據庫調優維度 業務需求&#xff1a;勇敢地對不合理的需求說不系統架構&#xff1a;做架構設計的時候&#xff0c;應充分考慮業務的實際情況&#xff0c;考慮好數據庫的各種選擇(讀寫分離?高可用?實例個數?分庫分表?用什么數據庫?)SQL及索引&#xff1a;根據需求編寫良…

C# 實體更新記錄:如何捕獲和記錄字段變化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 簡稱BB)是一種求解整數規劃問題的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;詳解與Python代碼示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 簡稱B&B&#xff09;是一種求解整數規劃問題的有效算法。它結合了搜索與迭代的思想&#xff0c;通過系統地枚舉候選解來尋找最優解。在…

Java Web常見框架尋找路由技巧

在Java Web代碼審計中&#xff0c;尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller&#xff0c;其作為MVC架構中的一個組件&#xff0c;可以說是每個用戶交互的入口點。簡單介紹下Java Web中常見框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模塊化語法

目錄 一、use 1、命名空間 2、私有變量 3、用with改變模塊中的默認值 二、forward 1、給forward模塊起別名&#xff0c;讓成員加前綴 2、利用hide or show手動控制成員的可訪問性 三、import 1、不存在命名空間&#xff0c;成員變量在import之后直接公開 2、可以在嵌…

springboot防止重復提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表單重復提交有多種策略&#xff0c;以下是幾種常見且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按鈕&#xff1a;在表單提交后&#xff0c;使用JavaScript立即禁用提交按鈕&#xff0c;防止用戶再次點擊。響應式提示&#x…

十、Java集合 ★ ?(模塊18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比較器排序、Collections、可變參數、Map】

day05 泛型,數據結構,List,Set 今日目標 泛型使用 數據結構 List Set 1 泛型 1.1 泛型的介紹 ★ 泛型是一種類型參數&#xff0c;專門用來保存類型用的 最早接觸泛型是在ArrayList&#xff0c;這個E就是所謂的泛型了。使用ArrayList時&#xff0c;只要給E指定某一個類型…

講真,現在留給2024年下半年軟考的時間還夠嗎?

常識是個好東西&#xff0c;但是有時候卻容易蒙蔽咱們的雙眼&#xff0c;就拿下半年軟考而言&#xff0c;看起來現在才7月份&#xff0c;剛剛入伏&#xff0c;考試要到11月份&#xff0c;是冬天呢&#xff0c;中間還隔了一個完整的秋季&#xff0c;常識感覺還很遙遠&#xff0c…

【Vue3】4個比較重要的設計模式!!

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 在我投身于前端開發的職業生涯期間,曾有一次承接了一個大型項目的維護工作。此項目運用的是 Vue 框架,然而其代碼結構紊亂不堪,可維護性極度糟糕??。 這使我深刻領會到,理解并運用 Vue 中的重要設計模式是何等關鍵! …

對LinkedList ,單鏈表和雙鏈表的理解

一.ArrayList的缺陷 二.鏈表 三.鏈表部分相關oj面試題 四.LinkedList的模擬實現 五.LinkedList的使用 六.ArrayList和LinkedList的區別 一.ArrayList的缺陷: 1. ArrayList底層使用 數組 來存儲元素&#xff0c;如果不熟悉可以來再看看&#xff1a; ArrayList與順序表-CSDN…

一些常見的網絡故障

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ??寶劍鋒從磨礪出&#xff0c;梅花香自苦寒來 ??運維工程師的職責&#xff1a;監…

【數據分析】Python數據分析實戰:從零開始構建數據管道

Python數據分析實戰&#xff1a;從零開始構建數據管道 引言一、數據獲取二、數據清洗三、數據分析四、數據可視化五、案例研究&#xff1a;預測股票價格結論 我嘗試訪問您所提供的鏈接&#xff0c;但似乎該鏈接指向的內容已失效或被移除&#xff0c;因此無法直接獲取并閱讀該文…

【iOS】——ARC源碼探究

一、ARC介紹 ARC的全稱Auto Reference Counting. 也就是自動引用計數。使用MRC時開發者不得不花大量的時間在內存管理上&#xff0c;并且容易出現內存泄漏或者release一個已被釋放的對象&#xff0c;導致crash。后來&#xff0c;Apple引入了ARC。使用ARC&#xff0c;開發者不再…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查殼&#xff0c;本題是32位&#xff0c;有殼&#xff0c;進行脫殼。 第二步 這里的 jnz 指令會實現一個跳轉&#xff0c;并且下面的0EC85D78Bh被標紅了&#xff0c;應該是一個不存在的地址&#xff0c;這些東西就會導致IDA無法正常反匯編出原始代碼&#xff0c;也稱…

中文科技核心論文發表

中文科技核心論文題目如下&#xff1a; 1.混凝土結構用纖維增強塑料筋的耐久性評述&#xff1a;適合建筑、結構、材料等專業 2.建筑工程用阻燃塑料的研究進展&#xff1a;適合建筑、材料專業 3.纖維增強熱塑性塑料在面部護具中的應用研究&#xff1a;適合化工、醫學、材料等專…

springcloud2021.x使用nacos做配置中心

spirngcloud2021.0.5使用nacos做配置中心遇到的問題 環境 jdk1.8&#xff0c;spring-boot 2.6.13&#xff0c;spring-cloud-alibaba 2021.0.5.0 &#xff0c;spring-cloud 2021.0.5 方案一 application.properties # Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts…

C++中的condition_variable:條件變量

理解 C 中的條件變量&#xff08;Condition Variable&#xff09; 在多線程編程中&#xff0c;我們常常需要一個線程等待某個條件的變化&#xff0c;比如等待數據的生成或某個標志位的設置。如果沒有條件變量&#xff08;condition_variable&#xff09;&#xff0c;線程可能會…