【Qt】Qt Style Sheets (QSS) 指南:打造個性化用戶界面

文章目錄

  • 前言:
  • 1. QSS 選擇器
  • 2. 子控件選擇器(Sub-Controls)
    • 2.1. 示例:給 QComboBox 給下拉按鈕加上圖標
    • 2.2. 示例:修改進度條顏色
  • 3. 偽類選擇器
    • 3.1. 代碼示例: 設置按鈕的偽類樣式.
    • 3.2. 代碼示例: 使用事件方式實現同樣效果
  • 4. 樣式屬性
    • 4.1. 代碼示例: 設置邊框和內邊距
    • 4.2. 代碼示例: 設置外邊距
  • 5. 控件樣式示例
    • 5.1. 按鈕
    • 5.2. 復選框
    • 5.3.輸入框
    • 5.4. 列表
    • 5.5 菜單欄
  • 6. 登錄界面
  • 總結:

前言:

在現代軟件開發中,用戶界面的美觀性和交互性是至關重要的。Qt Style Sheets(QSS)作為一種強大的樣式定制工具,為開發者提供了類似于CSS的樣式設置機制,使得界面設計更加靈活和多樣化。通過QSS,開發者可以輕松地為Qt應用程序中的控件定義外觀和行為,從而創建出既美觀又具有良好用戶體驗的界面。本文將詳細介紹QSS的選擇器、樣式屬性以及如何利用這些工具來定制各種控件的樣式,最終通過一個登錄界面的設計示例,展示QSS在實際開發中的應用。

1. QSS 選擇器

QSS 的選擇器支持以下幾種:
在這里插入圖片描述

 a.setStyleSheet("QPushButton { color : red; }");

這段代碼中 QPushButton 就是 類型選擇器了,QPushButton 也是 QWidget 的子類。

a.setStyleSheet(".QWidget { color : red; }");

這段代碼中 .QWidget類選擇器,不會選中子類。

在開發中,期望不同的控件的樣式不同,此時就需要使用 id 選擇器了,因為 id 是唯一的。

// main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style = "QPushButton { color: red; }";style += "#pushButton_2 { color: green; }";style += "#pushButton_3 { color: blue; }";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

在這里插入圖片描述
此時當類型選擇器id選擇器 選中同一個控件的時候,并且設置的樣式是沖突的,此時,id選擇器的優先級更高

并集選擇器

QString style = "#pushButton_2, QLineEdit, QLabel{ color: red; }";a.setStyleSheet(style);

在這里插入圖片描述

2. 子控件選擇器(Sub-Controls)

在這里插入圖片描述

在這里插入圖片描述

2.1. 示例:給 QComboBox 給下拉按鈕加上圖標

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style = "QComboBox::down-arrow{ image: url(:/down.png)}";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

在這里插入圖片描述

2.2. 示例:修改進度條顏色

 QProgressBar::chunk {background-color: #FF0000;

3. 偽類選擇器

前面介紹的選擇器,都是選中“控件”,偽類選擇器,選中的控件的“狀態”,“符合一定條件”的控件。
在這里插入圖片描述
這些狀態可以使用! 來取反. 比如 :!hover 就是鼠標離開控件時, :!pressed 就是鼠標松開時,
等等。
在這里插入圖片描述

3.1. 代碼示例: 設置按鈕的偽類樣式.

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style = "QPushButton { color: red; }";style += "QPushButton:hover { color: green; }";style += "QPushButton:pressed { color: blue; }";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

在這里插入圖片描述
上述代碼也可以使用事件的方式來實現.

3.2. 代碼示例: 使用事件方式實現同樣效果

  1. 創建 MyPushButton 類, 繼承自 QPushButton
    在這里插入圖片描述
  2. 把生成代碼中的構造函數改成帶參數 QWidget* 版本的構造函數. (否則無法和 Qt Designer 生成的代碼適配).
// mypushbutton.h
#include <QWidget>
#include <QPushButton>class MyPushButton : public QPushButton
{Q_OBJECT
public:MyPushButton(QWidget* parent);
};
// mypushbutton.cpp
#include "mypushbutton.h"MyPushButton::MyPushButton(QWidget* parent) : QPushButton(parent)
{}
  1. 在界面上創建按鈕, 并提升為 MyPushButton 類型
    在這里插入圖片描述
  2. 重寫 MyPushButton 的四個事件處理函數
// mypushbutton.h
class MyPushButton : public QPushButton
{Q_OBJECT
public:MyPushButton(QWidget* parent);void mousePressEvent(QMouseEvent* e);void mouseReleaseEvent(QMouseEvent* e);void enterEvent(QEvent* e);void leaveEvent(QEvent* e);};
// mypushbutton.cpp
#include "mypushbutton.h"MyPushButton::MyPushButton(QWidget* parent) : QPushButton(parent)
{this->setStyleSheet("QPushButton { color: red; }"); // 初始化值設為紅色
}void MyPushButton::mousePressEvent(QMouseEvent *e)  // 鼠標按下時設為藍色
{this->setStyleSheet("QPushButton { color: blue; }");
}void MyPushButton::mouseReleaseEvent(QMouseEvent *e) // 鼠標放開時還原為綠色
{this->setStyleSheet("QPushButton { color: green; }");
}void MyPushButton::enterEvent(QEvent *e) // 鼠標進入時設為綠色
{this->setStyleSheet("QPushButton { color: green; }");
}void MyPushButton::leaveEvent(QEvent *e) // 鼠標離開時還原為藍色
{this->setStyleSheet("QPushButton {color: red; }");
}

4. 樣式屬性

QSS 中的樣式屬性非常多,不需要都記住,核心原則還是用到了就區查,大部分的屬性和CSS是非常相似的。
box model 盒子模型, 來自于 CSS
在這里插入圖片描述
Qt 中每個 widget 都是一個矩形
在這里插入圖片描述
復合屬性,比方說,margin 可以拆分成 4 個屬性: margin-leftmargin-rightmargin-topmargin-bottom
margin: 10px; 四個方向都是 10px 的外邊距
margin: 10px 20px; 上下是 10px, 左右是 20px
margin: 10px 20px 30px 40px; 上右下左(順時針)
同樣, padding 也是可以拆成 4 個屬性:padding-leftpadding-rightpadding-toppadding-bottom

4.1. 代碼示例: 設置邊框和內邊距

int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style = "QLabel { border: 5px solid red; padding-left: 10px;}";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

在這里插入圖片描述

4.2. 代碼示例: 設置外邊距

#include "widget.h"
#include "ui_widget.h"#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setGeometry(0, 0, 100, 100);button->setText("按鈕");button->setStyleSheet("QPushButton { border: 5px solid red; margin: 20px;}");}Widget::~Widget()
{delete ui;
}

在這里插入圖片描述

5. 控件樣式示例

5.1. 按鈕

代碼示例: 自定義按鈕

QPushButton {font-size: 20px;  /*設置字體大小*/border: 2px solid rgb(138, 156, 255); /*設置邊框*/border-radius: 10px;  /*設置圓角*/background-color: rgb(63, 127, 191); /*設置背景色*/color: rgb(255, 255, 255); /*設置字體顏色*/
}QPushButton:pressed {background-color: rgb(255, 170, 0);
}

在這里插入圖片描述

5.2. 復選框

代碼示例:自定義復選框
在這里插入圖片描述

QCheckBox {font-size: 30px;
}QCheckBox::indicator { /*::indicator 子控件選擇器,選中checkbox中的勾選的部分*/width: 30px;  /*設置子控件寬度,對于普通控件無效(普通控件使用geometry方式設定尺寸)*/height: 30px; /*設置子控件高度*/
}QCheckBox::indicator:unchecked { /*:unchecked 偽類選擇器,選中checkbox 未被選中的狀態*/image:url(:/checkbox_unchecked.png);
}QCheckBox::indicator:unchecked:hover { /*:hover 偽類選擇器,選中鼠標移動上去的狀態*/image:url(:/checkbox_unchecked_hover.png);
}QCheckBox::indicator:unchecked:pressed { /*:pressed 偽類選擇器,選中鼠標按下的狀態*/image:url(:/checkbox_unchecked_pressed.png)
}QCheckBox::indicator:checked { /*:checked 偽類選擇器,選中checkbox被選中的狀態*/image:url(:/checkbox_checked.png);
}QCheckBox::indicator:checked:hover { image:url(:/checkbox_checked_hover.png);
}QCheckBox::indicator:checked:pressed {image:url(:/checkbox_checked_pressed.png)
}

在這里插入圖片描述

5.3.輸入框

QLineEdit {border-width: 2px;border-color: rgb(0, 170, 255);border-style: solid;border-radius: 10px;padding-left: 10px;color: rgb(0, 85, 255);font-size: 24px;background-color:rgb(220, 220, 220);selection-color: rgb(0, 255, 127);selection-background-color: rgb(180, 100, 100);
}QLineEdit:hover {border-color:rgb(0, 85, 255);
}

在這里插入圖片描述

5.4. 列表

qlineargradient 設置漸變色(線性漸變),此處要填寫6個參數。
在這里插入圖片描述

x1: 起點的橫坐標
y1: 起點的縱坐標
這里的取值,是非常有限的,要么是0,要么是1
x2: 終點的橫坐標
y2: 終點的縱坐標
從左到右的漸變: x1: 0、y1: 0、x2: 1、y2: 0
從上到下的漸變: x1: 0、y1: 0、x2: 0、y2: 1
對角線方向從左上到右下的漸變: x1: 0、y1: 0、x2: 1、y2: 1

QListView::item:hover {background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #FAFBFE, stop: 1 #DCDEF1);
}
QListView::item:selected {border: 1px solid #6a6ea9;background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6a6ea9, stop: 1 #888dd9);
}

在這里插入圖片描述

5.5 菜單欄

QMenuBar {background-color: #EDEDED; /* 背景顏色 */border: 1px solid #CCCCCC; /* 邊框 */border-radius: 6px; /* 設置菜單欄圓角 */spacing: 3px; /*菜單項的間隔*/
}QMenuBar::item {background-color: #dfdfdf; /* 每個菜單項的背景顏色 */padding: 4px 10px; /* 調整內邊距 */margin: 0px;border-radius: 6px; /* 設置菜單項圓角 */border: 1px solid transparent; /* 清除邊框,還可以保證文字不會錯位 */
}QMenuBar::item:selected {border: 1px solid #6a6a6a; /* 邊框 */background-color: #D3D3D3; /* 選中菜單項的背景顏色 */
}QMenu {background-color: #EDEDED; /* 下拉菜單背景顏色 */border: 1px solid #CCCCCC; /* 下拉菜單邊框 */border-radius: 6px; /* 設置下拉菜單欄圓角 */
}QMenu::item {background-color: transparent; /* 清除下拉菜單項的背景色 */border: 1px solid transparent; /* 清除邊框,還可以保證文字不會錯位 */padding: 4px 20px; /* 調整內邊距 */border-radius: 6px; /* 設置下拉菜單項圓角 */
}QMenu::item:selected {background-color: #D3D3D3; /* 選中下拉菜單項的背景顏色 */border: 1px solid #6a6a6a; /* 邊框 */border-radius: 6px; /* 設置菜單項圓角 */
}QMenu::separator {height: 2px;background-color: rgb(98, 98, 98);margin:2 5px;
}

在這里插入圖片描述

6. 登錄界面

基于上述學習過的 QSS 樣式,制作一個美化板本的登錄界面,

調整輸入框高度
在這里插入圖片描述
居中對齊
在這里插入圖片描述
在這里插入圖片描述
讓一個窗口變的好看,其中最明顯的一點就是設置背景。
直觀想法,是直接給 QWidget 頂層窗口設置背景圖,但是 Qt 中存在限制,直接給頂層窗口設置背景會失效。(原因暫時不可考)
可以給上述控件外頭套上套一個和窗口一樣大小的 QFrame 控件。也是 QWidget 的一個子類。

Qt 中設置背景圖,除了background-image 之外,還有border-image 屬性。
background-image :固定大小。
border-image:通過這種方式設置的背景,會自動跟隨控件的大小變化。

在這里插入圖片描述
在這里插入圖片描述

QFrame {border-image: url(:/background.jpg);
}QLineEdit {border: 1px solid transparent;color: rgb(221, 221, 221);background-color: #405361;padding: 0 5px;font-size: 20px;border-style: none;border-radius: 10px;
}QLineEdit:focus {border: 1px solid rgb(85, 170, 255); /* 獲取焦點時的邊框顏色 */
}QCheckBox {color: white;font-size: 18px
}QPushButton {font-size: 20px;  /*設置字體大小*/border: 1px solid rgb(0, 170, 255); /*設置邊框*/border-radius: 10px;  /*設置圓角*/background-color: rgb(63, 127, 191); /*設置背景色*/color: rgb(255, 255, 255); /*設置字體顏色*/
}QPushButton:pressed {background-color:rgb(0, 121, 181);
}

在這里插入圖片描述

總結:

  1. QSS 是什么,類似于 CSS 這樣的一種設置樣式的機制,
  2. QSS 基本用法
  3. 選擇器的使用
  4. 子控件選擇器
  5. 偽類選擇器
  6. 盒子模型
  7. 代碼例子,QSS 支持的樣式屬性值是很多的

通過本文的學習,我們了解到QSS是一種類似于CSS的樣式設置機制,它允許開發者通過選擇器來指定控件的樣式,并使用豐富的樣式屬性來定制界面。本文首先介紹了QSS的基本選擇器,包括類型選擇器、類選擇器、ID選擇器和并集選擇器,然后詳細探討了子控件選擇器和偽類選擇器的使用,這些選擇器能夠幫助開發者對控件的特定部分或狀態進行精確的樣式設置。接著,文章通過多個代碼示例展示了如何使用QSS來設置邊框、內邊距、外邊距等樣式屬性,以及如何為按鈕、復選框、輸入框、列表和菜單欄等常見控件定制樣式。最后,通過一個登錄界面的設計示例,我們看到了QSS在實際開發中的綜合應用,如何通過背景設置、控件樣式定制以及布局調整來創建一個既美觀又實用的用戶界面。通過本文的學習,開發者可以更加熟練地運用QSS來提升應用程序的界面設計,增強用戶體驗。

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

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

相關文章

數模混合芯片設計中的修調技術是什么?

一、修調目的 數模混合芯片需要修調技術主要是因為以下幾個原因&#xff1a; 工藝偏差&#xff08;Process Variations&#xff09;&#xff1a; 半導體制造過程中存在不可避免的工藝偏差&#xff0c;如晶體管尺寸、閾值電壓、電阻和電容值等&#xff0c;這些參數的實際值與…

阿里云計算之linux入門命令學習筆記(三)

Linux 提供了豐富的命令行工具&#xff0c;用于系統管理、文件操作、網絡管理、進程控制等。以下是一些常用的 Linux 命令及其簡要說明&#xff1a; 切換用戶 su 命令 su (substitute user) 命令用于切換用戶。 su - username # 切換到指定用戶&#xff0c;并加載…

【學習Day5】操作系統

?&#x1f3fb;記錄學習過程中的輸出&#xff0c;堅持每天學習一點點~ ??希望能給大家提供幫助~歡迎點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;指點&#x1f64f; 學習編輯文章的時間不太夠用&#xff0c;先放思維導圖&#xff0c;后續復習完善細節。

【C++】6-6 你好,輸出的格式控制(對齊)

6-6 你好&#xff0c;輸出的格式控制&#xff08;對齊&#xff09; 分數 10 全屏瀏覽 切換布局 作者 向訓文 單位 惠州學院 完善程序&#xff1a;按示例格式輸出所有分數&#xff0c;分數保留2位小數&#xff0c;分數左對齊輸出在兩根豎線之間 裁判測試程序樣例&#xff1…

vsto與vba的優缺點

VSTO&#xff08;Visual Studio Tools for Office&#xff09;和VBA&#xff08;Visual Basic for Applications&#xff09;都是用于擴展和定制Microsoft Office應用程序的開發工具。它們各有優缺點&#xff0c;適用于不同的場景。以下是對它們優缺點的詳細比較&#xff1a; V…

基于jeecgboot-vue3的Flowable流程-我的任務(三)

因為這個項目license問題無法開源&#xff0c;更多技術支持與服務請加入我的知識星球。 這一部分主要講我的任務里的詳情&#xff0c;看流程情況 1、主要調用record/index.vue&#xff0c;調用參數如下&#xff1a; /*** 詳情*/function handleDetail(record: Recordable) {c…

構建一個文字冒險游戲:Python 編程實戰

在本文中&#xff0c;我們將探索如何使用 Python 創建一個簡單的文字冒險游戲。通過這個項目&#xff0c;你將了解到基礎的編程技術&#xff0c;包括條件語句、函數和基本的用戶輸入處理&#xff0c;同時也能體會到文本游戲的魅力和設計的挑戰。 項目概述 文字冒險游戲是一種…

python-最接近target的值

【問題描述】&#xff1a;給定一個數組&#xff0c;在數組中找到兩個數&#xff0c;使它們的和最接近目標值的值但不超過目標值&#xff0c;然后返回它們的和。 【問題示例】&#xff1a;輸入target15,array[1,3,5,11,7],輸出14&#xff0c;31114。 完整代碼如下&#xff1a; …

童夢奇緣,味你而來 —— 蒙自源六一兒童節特別活動

在六月的暖陽下&#xff0c;孩子們的歡笑聲如同最美妙的樂章&#xff0c;奏響了夏日的序曲。在這個充滿童真與夢想的季節&#xff0c;蒙自源精心策劃了一場別開生面的六一兒童節特別活動&#xff0c;邀請每一位小朋友和大朋友&#xff0c;一同踏上一段奇妙的味蕾之旅。 從5月25…

【深入學習Redis丨第二篇】Redis集群部署詳解

文章目錄 Redis集群部署Redis4 Cluster部署 Redis集群部署 1 Redis各節點部署 使用源碼安裝各節點&#xff0c;不過與非cluster方式不同的是&#xff0c;配置文件中需啟動cluster相關的配置。 因本次為偽分布式部署&#xff0c;生產環境部署時建議至少3臺機器部署&#xff0…

列表和列表項

一、列表和列表項簡介 列表是 FreeRTOS 中的一個數據結構&#xff0c;列表被用來跟蹤 FreeRTOS中的任務&#xff08;任務當前的狀態&#xff09;&#xff0c;列表項就是存放在列表中的項目 列表相當于鏈表&#xff0c;列表項相當于節點&#xff0c;FreeRTOS 中的列表是一個雙向…

全文搜索算法的思路

一、作用 全文搜索算法適合文本文件的搜索。 二、應用場景 全文搜索算法廣泛應用在各個網站的搜索功能中。 三、全文搜索和正則模糊查詢的區別 1、全文搜索可以把搜索關鍵字進行分割&#xff0c;提取出相關的關鍵詞。 2、正則模糊查詢只能把關鍵字作為整體&#xff0c;不能…

Gigapixel AI 安裝和使用教程

簡介 Topaz Gigapixel AI 是一款功能強大的圖像放大軟件&#xff0c;它可以幫助用戶將低分辨率的圖像放大到更高的分辨率&#xff0c;而不會損失細節。該軟件利用人工智能技術&#xff0c;能夠智能分析圖像并重建丟失的細節&#xff0c;從而生成高質量的放大圖像。 安裝 下載…

系統架構設計師 - 操作系統(1)

操作系統 操作系統&#xff08;5-6分&#xff09;操作系統概述進程管理進程和線程的基本概念進程的狀態 ★前趨圖 ★★★★信號量與 PV 操作 ★★★★死鎖及銀行家算法 ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系統架構設計師 - 操作系統(1)知識&#xff0c…

CSS簡述(1)

CSS概述 CSS&#xff08;層疊樣式表&#xff0c;Cascading Style Sheets&#xff09;是一種樣式表語言&#xff0c;用于對HTML文檔控制外觀&#xff0c;定義布局。例如、css涉及字體、顏色、邊距、高度、背景圖像、高級定位等方面 CSS的主要用途&#xff1a; 1. 分離內容和樣…

2024.6.1 學習記錄

1、面經復習 2、項目使用guthub action 完成CI/CD&#xff0c;使用rollup打包為es格式 3、代碼隨想錄刷題復習

Go語言-切片底層探索 —— 補充篇:切片和底層數組到底是什么關系?

之前的切片探索中&#xff0c;上篇通過一道算法題目&#xff0c;了解到切片的兩大特性&#xff1a;一是&#xff1a;切片是引用類型&#xff0c;指向底層數組&#xff0c;修改其底層數組的時候&#xff0c;會影響切片中的值。二是&#xff1a;向切片中添加元素的時候&#xff0…

半導體光子電學期末筆記1: 電磁光學基本理論

Chapter 2: 電磁光學基本理論 電磁光學理論概述 真空中麥克斯韋方程組[p9] 在自由空間中&#xff0c;麥克斯韋方程組可以寫成如下形式&#xff1a; { ? H ? 0 ? E ? t (1) ? E ? μ 0 ? H ? t (2) ? ? E 0 (3) ? ? H 0 (4) \begin{cases} \nabla \times \…

Java——異常詳解

異常五個主要關鍵字&#xff1a;throw、try、catch、finally、throws 1. 異常的概念與體系結構 1.1 異常的概念 在Java中&#xff0c;程序執行過程中發生的不正常行為被稱為異常&#xff0c;如&#xff1a; 1. 算數異常 public static void main(String[] args) {System.ou…

基于MingGW64 GCC編譯Windows平臺上的 libuvc

安裝cmake 打開cmake官網 https://cmake.org/download/&#xff0c;下載安裝包&#xff1a; 安裝時選擇將cmake加到系統環境變量里。安裝完成后在新的CMD命令窗口執行cmake --version可看到輸出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…