1. 程式人生 > >PyQt5圖形和特效之Qt樣式表設定

PyQt5圖形和特效之Qt樣式表設定

前言

由於Qt樣式表的引入,定製Qt部件的外觀樣式變得非常簡單。無論你是想僅僅修改一個現有部件的外觀,還是想從零開始設計一套全新的介面風格,現在都有了一種新的方法而不必再去繼承並實現一個QStyle的子類。

1. 何為Qt樣式表

Qt 樣式表的思想很大程度上是來自於HTML的層疊式樣式表(CSS),通過呼叫QWidget::setStyleSheet()或 QApplication::setStyleSheet(),你可以為一個獨立的子部件、整個視窗,甚至是整個個應用程式指定一個樣式表。

樣式表是通過QStyle的一個叫做QStyleSheetStyle的特殊子類來實現的。這個特殊的子類實際上是其他的系統特定風格類的包裹類,它會把通過樣式表指定的自定義外觀風格應用在底層的系統特定風格之上。
Qt 4.2包含了一個叫做stylesheet的例子來幫助你學習樣式表,這個例子自帶了兩個樣式:Coffee和Pagefold。
上面的Coffee風格自定義了push button、frames和tooltip,但使用了下層的風格 (例如這裡是Windows XP風格)來繪製checkbox,combobox和radio button。
Pagefold風格完全重新定義了對話方塊中使用的所有控制元件的外觀,從而實現了一種獨特的,平臺無關的外觀。

2. 樣式表語法基礎

Qt樣式表與CSS的語法規則幾乎完全相同,如果你已經瞭解了CSS,完全可以跳過本節。
一個樣式表由一系列的樣式規則構成。每個樣式規則都有著下面的形式:

selector { attribute: value }

選擇器(selector)部分通常是一個類名(例如QComboBox),當然也還有其他的語法形式。
屬性(attribute)部分是一個樣式表屬性的名字,值(value)部分是賦給該屬性的值。
為了使用方便,我們還可以使用一種簡化形式:

selector1, selector2, ..., selectorM {
    attribute1: value1;
    attribute2: value2;
    ...
    attributeN: valueN;
}

這種簡化形式可以同時為與M個選擇器相匹配的部件設定N種屬性。例如:

QCheckBox, QComboBox, QSpinBox {
    color: red;
    background-color: white;
    font: bold;
}

這個規則設定了所有的QCheckBox、QComboBox和QSpinBox的前景色、背景色和字型。
線上文件列出了每種部件支援的所有屬性。在本文中,我們只使用最常見的幾種通用屬性。

3. 方箱模型

在樣式表中,每個部件都被看作是一個由四個同心相似的矩形組成的箱體:
空白(margin)、邊框(border)、填充(padding)和內容(content)


對於一個平面部件——例如一個空白、邊框和填充都是0畫素的部件——而言,這四個矩形是完全重合的。
空白區域位於邊框外,並且總是透明的。
邊框為部件提供了四周的框架,其border-style屬性可以設定為一些內建的框架風格,如inset、outset、solid和ridge。
填充在邊框和內容區域之間提供了空白間隔。

4. 前景與背景

部件的前景色用於繪製上面的文字,可以通過color屬性指定。
背景色用於繪製部件的填充矩形,可以通過background-color屬性指定。
背景圖片使用background-image屬性定義,它用於繪製由background-origin指定的矩形區域(空白、邊框、填充或內容)。
背景 圖片在矩形區域內的對齊和平鋪方式可以通過background-position和background-repeat屬性指定。
如果指定的背景圖片具有alpha通道(即有半透明效果),通過background-color指定的顏色將會透過透明區域。這一功能可以使背景圖片在多種環境下重複利用。
該例子中使用的樣式表如下所示:

QFrame {
    margin: 10px;
    border: 2px solid green;
    padding: 20px;
    background-color: gray;
    background-image: url(qt.png);
    background-position: top right;
    background-origin: content;
    background-repeat: none;
}

在這個例子中,QFrame四周的空白、邊框和填充值都是一樣的。
實際上margin屬性可以在上下左右四個方向分別指定我們需要的不同值,例如:

QFrame {
    margin: 14px 18px 20px 18px;
}

同時,我們也可以分別指定margin-top、margin-right、margin-bottom、margin-left四個屬性。

QFrame {
    margin-top: 14px;
    margin-right: 18px;
    margin-bottom: 20px;
    margin-left: 18px;
}

雖 然目前我們僅僅使用了QFrame作為例子,但是我們也可以同樣的將這些屬性應用於任何一個支援方箱模型的Qt部件,例如:QCheckBox、 QLabel、QLineEdit、QListView、QMenu、QPushButton、QTextEdit、和QToolTip。

5. 建立可縮放樣式

在預設情況下,通過background-image指定的背景圖片會自動重複平鋪,以覆蓋部件的整個填充矩形(即邊框裡面的那個區域)。
如果我們想建立能夠隨著部件大小自動縮放而不是平鋪的背景,我們需要設定一種稱之為“邊框圖片”的東東。
“邊框圖片”可以通過border-image屬性指定,它同時提供了部件的背景和邊框。一個“邊框圖片”被分為九個部分(九宮格),有點向tic-tac-toe遊戲的棋盤。

當一個部件的邊框被填充時,四角的格子通常不會發生變化,而其餘的五個格子則可能被拉伸或平鋪以填充可用空間。
當指定一個“邊框圖片”時,除了圖片本身,我們還必須指定用來分割九宮格的四條分割線。同時我們還必須指定非邊角的格子是應該平鋪還是拉伸,以及邊框的寬度(用來確定邊角格子的大小,防止邊角被縮放變形)。

例如,下面的樣式表定義了上圖中的button:

QPushButton {
    border-width: 4px;
    border-image: url(button.png) 4 4 4 4 stretch stretch;
}

另外,“邊框圖片”還應該含有alpha通道,以使背景能夠在邊角處露出來。

6. 控制大小

min-width和min-height兩個屬性可以用來指定一個部件的內容區域的最小大小。這兩個值將影響部件的minimumSizeHint(),並在佈局時被考慮。
例如:

QPushButton {
    min-width: 68px;
    min-height: 28px;
}

如果該屬性沒有被指定,最小大小將從部件的內容區域和當前樣式中繼承。

7. 處理偽狀態

部件的外觀可以按照使用者介面元素狀態的不同來分別定義,這在樣式表中被稱為“偽狀態”。例如,如果我們想在一個push button在被按下的時候具有sunken的外觀,我們可以指定一個叫做 :pressed 的偽狀態。

QPushButton {
    border: 2px outset green;
    background: gray;
}
QPushButton:pressed {
    border-style: inset;
}

可用的偽狀態列表

偽狀態 描述
checked button部件被選中
disabled 部件被禁用
enabled 部件被啟用
focus 部件獲得焦點
hover 滑鼠位於部件上
indeterminate checkbox或radiobutton被部分選中
off 部件可以切換,且處於off狀態
on 部件可以切換,且處於on狀態
pressed 部件被滑鼠按下
unchecked button部件未被選中

8. 使用子部件定義微觀樣式

許多部件都包含有子元素,這些元素可以稱為“子部件”。Spin box的上下箭頭就是子部件最好的例子。
子 部件可以通過::來指定,例如QDateTimeEdit::up-button。定義子部件的樣式與定義部件非常相似,它們遵循前面提到的方箱模型(即 它們可以擁有自己的邊框、背景等),並且也可以和偽狀態聯合使用(例如QSpinBox::up-button:hover)。

可用的子部件型別

子部件列表

子部件 描述
::down-arrow combo box或spin box的下拉箭頭
::down-button spin box的向下按鈕
::drop-down combo box的下拉箭頭
::indicator checkbox、radio button或可選擇group box的指示器
::item menu、menu bar或status bar的子專案
::menu-indicator push button的選單指示器
::title group box的標題
::up-arrow spin box的向上箭頭
::up-button spin box的向上按鈕

通過指定subcontrol-position和subcontrol-origin屬性,子部件可以被放置在部件箱體內的任何位置。並且,子部件的位置 還可以使用相對或絕對的方式進一步的調整。具體選擇何種調整方式取決於子部件具有固定的大小,還是會隨著父部件而變化。

8.1. 相對定位

相對定位適合於子部件具有固定大小的情形(通過width和height指定子部件大小)。使用這種方式,子部件可以以相對於subcontrol- position和 subcontrol-origin屬性定義的原始位置進行移動調整。
使用left屬性可以把子部件向右移,top屬性可以把子部件向左移。
例如:

QPushButton::menu-indicator {
    image: url(menu_indicator.png);
    width: 13px;
    height: 13px;
    subcontrol-origin: padding;
    subcontrol-position: bottom right;
}

當按下按鈕時,我們可以把選單指示器從原來的位置向右下方移動幾個畫素來模擬按鈕按下的狀態。

QPushButton::menu-indicator:pressed {
    position: relative;
    top: 2px;
    left: 2px;
}

8.2. 絕對定位

絕對定位適合於子部件的位置隨父部件的變化而變的情形。與前面的例子相同,subcontrol-origin定義了父部件箱體的參考矩形。子部件的矩形區域則可以隨後通過相對於這個參考矩形四邊的偏移量來定義。

QPushButton::menu-indicator {
    border: 2px solid red;
    subcontrol-origin: padding;
    position: absolute;
    top: 2px;
    right: 2px;
    bottom: 2px;
    left: 40px;
}

對於寬度或高度固定的子部件,subcontrol-position被用來說明其在subcontrol-origin指定矩形內的對其方式:

QPushButton::menu-indicator {
    image: url(menu_indicator.png);
    width: 13px;
    subcontrol-origin: padding;
    subcontrol-position: bottom right;
    position: absolute;
    top: 2px;
    bottom: 2px;
    right: 2px;

本文翻譯自Qt季刊(Qt Quaterly)第20期。
原文地址: http://doc.trolltech.com/qq/qq20-qss.html
通過Qt4.2樣式表定製程式外觀
作者:Girish Ramakrishnan
翻譯:Zhang Chi [email protected]

相關推薦

PyQt5圖形特效Qt樣式設定

前言 由於Qt樣式表的引入,定製Qt部件的外觀樣式變得非常簡單。無論你是想僅僅修改一個現有部件的外觀,還是想從零開始設計一套全新的介面風格,現在都有了一種新的方法而不必再去繼承並實現一個QStyle的子類。 1. 何為Qt樣式表

QtQSlider樣式設定

最近,做了一些的的Qt的關於QSlider的樣式表。簡單的舉下例子:樣式表中的內容:QSlider::groove:horizontal { border: 0px solid #bbb; } Q

零基礎學Qt 4程式設計例項Qt 樣式的應用

下面我們以一個例項來講解樣式表的應用。這個例子取材於Qt Demo,比較複雜,有一定難度,基本上覆蓋了前面幾章講述的各種技能點,主要包括: ◆ 如何自定義Qt 的樣式表 ◆ 如何在應用程式中應用樣式表 ◆ 如何不使用樣式表來設定應用程式的樣式 ◆ 如何使用單繼承法從.ui檔案

QT樣式設定背景色 background-color無效的原因

例如我們給一個按鈕設定背景色為紅色:QPushButton {        background-color: red; }結果發現,按鈕的背景色並沒有被設定為紅色!問題的原因,QT的幫助文件裡講了,比較難找,開啟幫助文件,依次展開->style sheet->

有關於QT樣式的一些知識(使用方法編寫語法)

一、QT樣式表的介紹      QT樣式表文件.qss類似於層疊式樣式表,樣式表文件能夠減少專案中源原件的程式碼量,原始碼中不必再對每個控制元件的樣式進行設定。而且樣式表是一個獨立的檔案,其非常便於修改,對大型工程專案的統一介面風格設計和修改都很便利。      本文僅對

Qt淺談二十二Qt樣式

一、簡介       不斷總結好的樣式表,美化自己的介面(在實際工作中會不斷的更新)。 二、詳解 1、載入樣式表文件 QFile file(":/qss/stylesheet.qss"); file.open(QFile::ReadOnly); QString sty

JavaScript高階程式設計DOM2DOM3樣式操作樣式第12.2.2講

CSSStyleSheet 型別表示的是樣式表,包括通過<link>元素包含的樣式表和在<style>元素中定義 的樣式表。有讀者可能記得,這兩個元素本身分別是由HTMLLinkElement 和HTMLStyleElement 型別 表示的。但是,

QT樣式

listview 空間 vertica pop 顏色 dock des imu stat QT樣式表 一、QT樣式表簡介 1、QT樣式表簡介 QSS的主要功能是使界面的表現與界面的元素分離,使得設計皮膚與界面控件分離的軟件成為可能。 QT樣式表是允許用戶定制wi

QT vs2010 QT與Visual Studio 2010整合的例子

做GUI介面的設計時,目前已不再拘泥於VS的MFC框架,有很多開源的工具。本例以QT與VS2012的整合為例,演示環境搭建,後續將會用QT做VT的開發工作。 第一步,下載QT和QT與VS的外掛,在VS2010下以及結合VTK的情況,網路上經網友實驗後效果比較好的版本如下:

引入 EChartsBootstrap的bootcdn樣式路徑

<!DOCTYPE html> <html><head> <meta charset="utf-8"> <title>運營報表</title> <link rel="stylesheet" href

Qt樣式(QSS)Demo:黑色扁平加漸變

(2019-1-3改進) 把上次的純色背景加了點漸變,感覺好看了點。 關於顏色顯示:有些電腦顯示器設定偏亮/暗,可以調節下。 關於控制元件大小:標題高度30畫素,控制元件高度28px。 關於字型大小:一般設定為15px的宋體,沒有考慮解析度問題。 關於圖示:阿里圖示https

Qt樣式(QSS)Demo:黑色扁平風格

從昨天下午到現在整理了一天,有點遺憾是表頭高亮時字型加粗沒找到怎麼修改,還有子選單的小三角。 時間問題,Demo裡只添加了我常用的控制元件,像QListView,QCalendarWidget等都沒做。 其中,圖示基本是在阿里巴巴向量圖示庫找的,整體效果圖如下: 關於顏色

Qt樣式qss的兩種用法

Qt的qss(樣式表)使我們能夠自定義控制元件的顯示效果,令介面看起來不再單調,更具個人風格,而在VS+Qt的開發環境下,實現樣式表主要有兩種方式,下面以QPushButton為例介紹這兩種實現方式: 1.通過Qt Designer修改樣式表   在VS下新建Qt工程,會自

QT樣式styleSheet(qss)幫助文件的使用,及相關術語、概念

學習樣式表,最好的參考資料莫過於QT自帶的幫助文件,隨便開啟一個QT工程,點選->幫助->索引->styleSheet,即可開啟QT所有關於樣式表的幫助資訊,如下圖所示: 比如,我們想查查下拉列表控制元件QComboBox支援哪些樣式屬性,可以點選上圖

Qt樣式應用

通過檔案定義qss1  將QSS程式碼寫入.qss檔案中;(calendar.qss)2  在qrc中加入該.qss檔案;3  在程式碼中進行讀取使用     QFile file(“:/calendar.qss”);    file.open(QFile::ReadOnly);    QString st

QT樣式——url路徑

ack url路徑 通過 xxx 操作 ets jpg style img 一、絕對路徑 setStyleSheet("background:url(c:/xxx/theme/img.jpg)"); 二、相對路徑 setStyleSheet("background:u

Qt介面風格樣式

QstyleFactory 測試當前系統支援的風格: #include "mainwindow.h" #include <QApplication> #include <QStyleFactory> #include <QDebug> i

Qt樣式QSS

使用Qt樣式表    Qt的樣式表主要是受到了CSS的啟發。因為樣式表是一種在執行時解釋的普通文字檔案,使用它們不需要具備任何程式設計知識。樣式表作用於上層的當前啟用的QStyle上(例如QWindowsVistaStyle)。因為建立樣式表不引入任何子類,所

QtQSS(樣式語法)

轉自:https://blog.csdn.net/liang19890820/article/details/51691212簡述Qt樣式表(以下統稱QSS)的術語和語法規則幾乎和CSS相同。如果你熟悉CSS,可以快速瀏覽以下內容。樣式規則QSS包含了一個樣式規則序列,一個樣式規則由一個選擇器和宣告組成,選擇

Qt滑鼠樣式特效探索樣例

心血來潮,突然想在Qt裡玩一把滑鼠樣式,想到在瀏覽網頁時,經常看到漂亮的滑鼠動畫,於是今天摸索著亂寫個粗糙的demo,來滿足自己的好奇心。 效果圖     方案要點     1.不管用什麼控制元件,顯示動畫需要的4張星星圖,大小依次遞減。     2.記錄滑