日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QSS使用总结

發布時間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QSS使用总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

QSS使用總結:

1. 什么是QSS
QSS:全稱Qt Style sheet即Qt樣式表,他是Qt提供的一種用來自定義控件外觀的機制。
QSS大量參考了CSS的內容,只不過QSS的功能比CSS要弱很多,體現在選擇器更少,可以使用的屬性也更少,
并且并不是所有的屬性都可以在Qt的所有控件上。

2. QSS的使用
1 全局QSS文件方式
? 一般將項目中所有控件的樣式寫入一個文件中,然后在程序啟動后加載文件然后設置全局的樣式
?
int main(int argc, char* argv[])
{
?? ?...
?? ?QFile file(":/qss/default.qss");
?? ?file.open(QFile::ReadOnly);
?? ?QTextStream filetext(&file);
?? ?QString styleSheet = filetext.readAll();
?? ?qApp->setStyleSheet(styleSheet);
?? ?...
}?

2 在程序中為某個具體的控制設置樣式
ui->okBtn->setStyleSheet("font-size:30px");

--->當用戶在程序中設置了控件的qss樣式,則會覆蓋全局的樣式

3. QSS的語法規則
QSS的規則幾乎和CSS相同,一條QSS樣式由兩部分組成,一部分為選擇器 指定了設置樣式的控件,另一部分為指定的屬性的值,表示哪些屬性會收到影響QPushButton{ color: #FF0000}。
QPushButton表示選擇器,指定了所有的QPushButton以及其子類會收到影響,注意凡是繼承QPushButton的類都會受到影響,這點與CSS不同,因為CSS沒有類/子類的概念僅為標簽。
而后的{ color: #FF0000}則是規則的定義,表明指定前景色為紅色,該樣式的意義為設置QPushButton類以及子類的所有實例的前景色設置為紅色

如果MyButton繼承自QPushButton,么上面的規則也會應用到所有MyButton控件上,但是如果規則是如下的:
MyButton{color:#FF0000}?
則只會對MyButton的實例應用紅色的前景顏色,而對QPushButton的實例沒有應用。

4. `
通配選擇器:*; 匹配所有的控件
類型選擇器:QPushButton; 匹配所有的QPushButton和其子類的實例
屬性選擇器:QPushButton[flat="false"]; 匹配所有flat屬性為false的QPushButton實例,也可以使用自定義的屬性
類選擇器: .QPushButton; 匹配所有的QPushButton的實例,但是不匹配其子類。這與CSS中的選擇器不一樣,其前面有個點號
ID選擇器: #myButton; 匹配所有ID為myButton的控件實例,這里的ID指的是objectName指定的值
后代選擇器: QDialog QPushButton; 所有QDialog容器下面的QPushButton, 不管是直接的還是間接的
子選擇器:QDialog > QPushButton; 所有的QDialog容器下面的QPushButton,其中要求QPushButton的直接父類控件使QDialog
--->另外上面的所有的這些選擇器可以聯合使用,并且支持一次設置多個選擇器類型,用逗號隔開,這點和CSS一樣
例如:frameCut,#frameInterrupt,#frameJoin 表示所有這些id使用一個規則。#mytable QPushButton 表示選擇所有id為mytable的容器下面的QPushButton實例。

5. QSS子控件
QSS的子控件實際上也是選擇器的一種,因為這種選擇器與CSS有一些不同,所有單獨列出來。QSS的子控件選擇器是應用在一些復雜控件上的,典型的例如QComboBox,
該控件的外觀包含幾個部分,一般情況下有一個矩形的外邊框,右邊有一個向下的箭頭用于點擊之后會有彈出下拉列表。
例如:QComboBox::drop-down{image:url(":/iamges/dropdown.png")}
上面的樣式指定所有的QComboBox的下拉框箭頭的圖片為自定義圖片dropdown.png
::dropdown子控件選擇器也可以與上面提到的選擇器一起聯合使用。
QComboBox#myComboBox::drop-down{image:url(":/iamges/dropdown.png")}
指定id名為myComboBox的QComboBox控件的下拉箭頭的自動以圖片,要注意的是子控件選擇器實際上是選擇復合控件中的一部分,也就是說對復合控件中的一部分應用樣式,
例如QComboBox的下拉箭頭指定圖片而不是為QComboBox指定圖片

QSS為很多復雜的復合控件提供了子控件的定義,以方便對這些復合控件的各個部分進行樣式設置。限于篇幅,本文也不能將這些可用的子控件都列出來,在安裝QtCreator之后自帶的幫助中就有很詳細的描述。

https://blog.csdn.net/Staranywhere/article/details/106652678

6. QSS偽狀態
QSS的偽狀態選擇器實際上與CSS中的類似,是以冒號開頭的一個選擇表達式。例如:hover表示當鼠標經過時的狀態,他限制了當控件在某一種狀態下的時候才能應用QSS規則。偽狀態只能描述一個控件的狀態,或者是一個復合控件的子控件的狀態,所以該偽狀態選擇器智能放在選擇器的最后面
例如:QComboBox:hover{background-color:red;} 該規則表示當鼠標經過QComboBox上面時,其背景色指定為紅色,該偽狀態:hover描述的是QComboBox的狀態
偽狀態除了可以描述選擇器的控件以外,還可以描述子控件選擇器所選擇的復合控件中的子控件的狀態。
例如: QComboBox::drop-down:hover{background-color:red;} 該規則表示鼠標經過QComboBox的下拉框箭頭的時候,該下拉框的背景顏色變成紅色。
幾個偽狀態可以一起使用, 例如:QCheckBox:hover:checked{color: red} 指定一個當鼠標經過一個選中的QCheckBox的時候,設置其文字的前景顏色為紅色

QSS提供了很多的偽狀態,一些偽狀態只能用在特定的控件上,具體有哪些偽狀態,在Qt的幫助里面有詳細的列表,限于篇幅這里也不列出了。

https://blog.csdn.net/Staranywhere/article/details/106967756

7. QSS級聯與沖突
QSS中的級聯包含以下幾個方面
1 當在同一個控件上應用兩個不同的規則, 那么應該應用哪一個規則的問題,也就是如何解決這種沖突
2 在一個容器控件上設置的QSS規則會對容器里面的控件產生效果(這要取決于容器控件上設置的QSS規則時什么樣的規則, 如果其規則僅僅針對容器控件本身則該子控件無影響,如果該QSS規則里面還有對子控件的設置,則自然會對子控件產生效果)。
級聯問題是解決當一個控件被層層父容器包裹,并且在每一層的父容器都有對該控件的樣式設置的時候,該控件的最終效果是合并這些父容器上的QSS效果

沖突問題:
QPushButton#okButton{color: gray}
QPushButton{color: red}
這兩條規則都會應用到名為obButton的按鈕上,但是他們為同一個屬性設置了不同的顏色,這會有沖突,那么要解決這樣的沖突就必須考慮到選擇器的特異性(具體性),顯然QPushButton#okButton僅僅針對對象名為okButton的控件有效果,而QPushButton卻對所有的QPushButton的實例或者是其子類的實例有效果,顯然QPushButton#okButton選擇器更加特殊,也就是更具有特異性。所以最終okButton前景色被應用為灰色。如果兩條規則的特異性一樣,那么就選擇聲明靠后的那一條。
--->另外如果一個選擇器應用了偽狀態,而另一個沒有,那么應用偽狀態的選擇器更加特殊。
例如:
?? ?QPushButton:hover{color: white}
?? ?QPushButton{color: red}
顯然QPushButton:hover比單純的QPushButton更加具有特異性。這兩條規則表示當鼠標放在按鈕上的時候文字是白色,其他情況下都是紅色。?? ?

--->如下面兩個規則的特異性是一樣的,那么應該是如何應用呢:即如果兩條規則的特異性一樣,那么就選擇聲明靠后的那一條。
例如:
?? ?QPushButton:hover { color: white } ?//如果鼠標經過則前景白色
?? ?QPushButton:enabled { color: red } ?//如果按鈕是enabled狀態則前景紅色
所以默認情況下前景文字是紅色的,當鼠標經過的時候并不會變成白色,因為他們的特異性是一樣的,所以選擇后面的,也就是紅色。
那么換一下順序會怎樣呢:
?? ?QPushButton:enabled { color: red } ?//如果按鈕是enabled狀態則前景紅色
?? ?QPushButton:hover { color: white } ?//如果鼠標經過則前景白色
當鼠標經過的時候,就變成白色的了,因為他們的特異性一樣,所以選擇后面的規則,也就是鼠標經過前景變成白色。
--->如果把其中的一條的特異性增加,
例如:
?? ?QPushButton:hover:enabled { color: white }
?? ?QPushButton:enabled { color: red }
那么第一條的特異性比第二條大,所以應用第一條的規則。
--->另外一種特異性發生在類型選擇器上:
?? ?QPushButton { color: red } ? //應用在所有的QPushButton上
?? ?QAbstractButton { color: gray } //應用在所有的QAbstractButton上
而在類的繼承結構上,QAbstractButton是QPushButton的父類,顯然QPushButton更加具有特異性,所以QPushButton的前景顏色被應用為紅色,而不是灰色。

有沒有一個辦法來確定兩條QSS規則的特異性大小呢,其實QSS使用的特異性的計算方法與CSS是一樣的,詳細可以參考CSS2的文檔規范,這里還是簡要的說明一下,特異性這個東西在CSS中一般被稱為權重,權重越大的越優先使用,CSS的計算規則如下:
A 計算一條規則中id選擇器的個數,假設存放在變量a中
B 計算一條規則中類選擇器和屬性選擇器的個數,粉放在變量b中
C 計算一條規則中的類型選擇器的個數,存放在變量c中?
4.忽略偽元素,對應QSS中的子控件
下面是具體的計算方法:
* ? ? ? ? ? ? {} ?/* 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 */
上面的計算規則是CSS的計算規則,同樣可以應用的QSS上。

關于級聯:
QSS可以設置在QApplication上,也可以設置在一個部件的容器部件上,也可以設置在子孫控件上,一個部件最終使用的樣式是合并了他的所有父容器,祖父容器等上面設置的所有樣式的結果,這些設置會進行疊加。 如果發生沖突,則選擇部件本身設置的樣式效果
--->QSS中似乎為父容器控件本身設置了樣式,并不會被子控件繼承。
例如如果QFrame中有一個QPushButton控件,則語句 ui->frame->setStyleSheet{"Frame{color: red; border: 1px solid red}"} 僅僅為QFrame設置樣式并不會應用到其里面的QPushButton上。 如果下面的語句就可以:
ui->frame->setStyleSheet("QPushButton{ color: red; border:1px solid red }");
ui->frame->setStyleSheet("*{ color: red; border:1px solid red }");

8 QSS實際應用中要注意的地方
在使用QSS的時候遇到過一些坑,看似簡單,但是如果不知道的話,還是很折磨人的:
<1>使用QSS設置邊框無效,例如:
border:1px solid red; //Ok
border:solid 1px red; //Error
border:red 1px solid; //Error
border:red solid 1px; //Error
設置邊框顏色和像素的時候,必須是第一種順序,而CSS中是無所謂的,至于原因,我也不清楚,就是這么坑人。

<2> QSS設置寬高無效:
在QSS中設置寬高必須要使用 min-width和min-height,max-width,max-height來設置,用width和height設置是沒有任何效果的。

<3>QComboBox的樣式設置的問題:
QcomboBox是一個復雜的控件,QComboBox由3部分組成,一個是QComboBox的外框,里面有一個下拉按鈕,這個按鈕可以通過QComboBox::drop-down 來控制其位置,將其定義到QComboBox的左邊而不一定是右邊。另外在這個下拉按鈕上面一般會有一個向下的箭頭,這個箭頭圖像也是可以定制的,通過QComboBox::down-arrow來指定箭頭的圖像。

如果要控制QComboBox的彈出下拉列表的樣式需要通過:
QComboBox QAbstractItemView {
? //設置當點擊下拉按鈕之后彈出的下拉列表的樣式,要注意的是這里的樣式
? //僅僅只能設置彈出的整個下拉列表范圍的矩形的樣式,不能設置下拉列表
? //中的每一個下拉項的樣式,例如不能設置每一個下拉項高度
}
QcomboBox{
? //設置未彈出下拉列表的樣式
}
?
QComboBox QAbstractItemView::item {
//設置彈出下拉列表中的每一個下拉項的樣式,這里的樣式要想生效,必須先
//對QcomboBox做下面的設置
//QStyledItemDelegate* itemDelegate = new QStyledItemDelegate();
//combox->setItemDelegate(itemDelegate); ??
}

總結

以上是生活随笔為你收集整理的QSS使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。