【Qt】Qt界面美化指南:深入理解QSS樣式表的應用與實踐

文章目錄

  • 前言:
  • 1. 背景介紹
  • 2. 基本語法
  • 3. QSS 設置方式
    • 3.1. 設置全局樣式
    • 3.2. 從文件加載樣式表
    • 3.3. 使用 Qt Designer 編輯樣式
  • 總結:

前言:

在當今這個視覺至上的時代,用戶界面(UI)的設計對于任何軟件產品來說都至關重要。一個美觀、直觀且易于使用的界面不僅能夠提升用戶體驗,還能增強品牌形象,甚至在某些情況下,成為產品成功的關鍵因素之一。在Qt框架中,QSS(Qt樣式表)提供了一種類似于網頁前端CSS的強大工具,允許開發者對應用程序的界面進行細致的美化和定制。本文將深入探討QSS的基本概念、基本語法以及如何通過不同的方式設置樣式,旨在幫助開發者更好地利用這一工具,打造出更加出色的用戶界面。

1. 背景介紹

界面優化 -> 美化

  • 一個程序的界面是否好看,是否重要呢?
    有些面向專業領域的程序,界面好看與否,不是很關鍵,更關鍵的是實際效果。有些面向普通用戶領域的程序,界面好看,還是很大的加分項。

QSS => 網頁前端 CSS
能夠針對界面“樣式”來進行設置
包括不限于:大小、位置、顏色、背景、間距、字體…
CSS 的功能是非常強大,非常豐富。
QSS 要遜色一些,也可以完成很多工作。

有時候可以通過 QSS 設置樣式(設置字體屬性,也可以通過 C++ 代碼設置樣式)。如果兩者沖突,QSS 優先級更高。

2. 基本語法

對于 CSS 來說,基本語法結構非常簡單

選擇器 {屬性名: 屬性值; 
}

選擇器:先選擇某個控件/莫一類控件,接下來進行的各種屬性的設置,都是針對控件生效的。
鍵值對:針對某些樣式具體的設置了。

例如:

QPushButton { color : red; }

或者:

QPushButton { color : red; 
}

上述代碼的含義表示,針對界面上所有的 QPushButton,都把文本設置為紅色。

設置樣式的時候,是可以指定某個控件來設置的。
指定控件之后,此時的樣式就會指定的控件,也會正對子控件生效。

ui->pushButton->setStyleSheet("QPushButton{color : #ffaa00; }");

由于 QPushButton 沒有子控件了,可以設置給QWidget

this->setStyleSheet("QPushButton{color : red}");

這樣就可以同時給不同按鈕設了。
在這里插入圖片描述

在這里會針對 this 的子控件生效,既要考慮子控件,也是要和選擇器相關的

// 在 main.cpp 中設置全局樣式
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QPushButton { color: red; }");Widget w;w.show();return a.exec();
}

3. QSS 設置方式

3.1. 設置全局樣式

界面上所有的樣式都集中組織到一起來組織。

  1. 如果設置了全局樣式,然后在某個控件里又設置了其它樣式,會咋樣?
// widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->pushButton->setStyleSheet(" QPushButton {font-size: 50px; }");
}Widget::~Widget()
{delete ui;
}

在這里插入圖片描述
此時這兩方面的樣式,會“疊加”起來

  1. 如果設置了全局樣式,在某個控件里設置的樣式和全局樣式沖突了,又會咋樣?
ui->pushButton_2->setStyleSheet(" QPushButton {color: green; }");

在這里插入圖片描述
當全局樣式和局部樣式沖突的時候,局部樣式的優先級是更高的,覆蓋了對應的全局樣式。
實際開發中,就可以在全局樣式中設置比較通用的樣式,統一整個系統的界面風格,如果需要針對某個控件進行微調,可以使用局部樣式來 做出調整。

3.2. 從文件加載樣式表

QSS 上述代碼中,樣式代碼 和 C++代碼都是混在一起的。

ui->pushButton->setStyleSheet("QPushButton{color : #ffaa00; }");

如果 QSS 樣式代碼比較簡單,無所謂了;如果 QSS 代碼非常復雜,繼續這樣搞,代碼維護成本就很高了。
就可以把樣式代碼拎出來,放到單獨的文件中。后續可以讓 C++ 代碼來讀取并加載文件內容。

  1. 創建 qrc 文件,通過 qrc 文件管理樣式文件
  2. 創建單獨的 qss 文件,把這樣的文件放到 qrc 中
    用記事本新建一個 qss 文件:
    在這里插入圖片描述
    在這里插入圖片描述

在這里插入圖片描述

  1. 編寫 C++ 代碼,讀取 qss 文件中的類容,并設置樣式
// main.cpp
#include "widget.h"#include <QApplication>
#include <QFile>QString loadQSS() {QFile file(":/style.qss");file.open(QFile::ReadOnly);QString style = file.readAll();file.close();return style;
}int main(int argc, char *argv[])
{QApplication a(argc, argv);// 設置全局樣式a.setStyleSheet(loadQSS());Widget w;w.show();return a.exec();
}

這個方案僅供大家參考,實際開發中還有更方便的方案。

3.3. 使用 Qt Designer 編輯樣式

在 Qt Designer 中直接繼承了這樣的功能,允許我們把樣式直接寫到 .ui 文件里。
.ui 文件中直接點擊 改變樣式表,就可以直接編寫界面樣式了,這里進行的修改都會記錄到 ui 文件中,并且在程序運行時自動生效,而且這里還能進行預覽。
在這里插入圖片描述
在這里插入圖片描述
在 xml 文件中就 可以看到 記錄了當前編輯的樣式,后續 Qt 根據 ui 文件生成 C++代碼,也就會同時把樣式設置進去。
在這里插入圖片描述

由于設置樣式太靈活,有很多地方都能設置。就導致當某個樣式不符合預期的時候,排查起來就比較麻煩了。

  1. 全局樣式 (QApplication 設置的)
  2. 指定控件的樣式(這個控件是否設置了樣式)
  3. 指定控件的父控件的樣式(可能是從父控件中繼承過來的)
  4. qss 文件中的樣式
  5. ui 文件中的樣式

實際開發中,如果需要設置樣式,建議最好統一使用某一種方式來設置。

總結:

本文詳細介紹了Qt樣式表(QSS)的基本概念、語法結構以及多種設置方式,包括全局樣式的設置、從文件加載樣式表以及使用Qt Designer進行樣式編輯。通過這些方法,開發者可以根據需要靈活地定制應用程序的界面,從而提升用戶體驗和產品的整體吸引力。同時,文章也指出了在實際開發中,由于樣式設置的靈活性,可能會導致樣式沖突和排查困難的問題,因此建議開發者在項目中統一使用一種樣式設置方法,以保持界面風格的一致性和可維護性。通過本文的學習,希望開發者能夠更加熟練地運用QSS,打造出既美觀又實用的用戶界面。

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

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

相關文章

智能制造案例專題|與MongoDB一起解鎖工業4.0轉型與增長的無限潛力!

MongoDB 智能制造 數字化技術的洪流在各個產業鏈的主干和枝節涌現。在工業制造領域&#xff0c;能否通過數字化技術實現各生產要素、生產環節之間的緊密配合&#xff0c;高效規劃、管理整個生產流程&#xff0c;是企業提升韌性、贏得競爭的關鍵。隨著工業4.0的深入發展和智能…

高級Java開發者的自我修養:深入剖析JVM垃圾回收機制及面試要點

在探索Java虛擬機&#xff08;JVM&#xff09;的奧秘過程中&#xff0c;垃圾回收機制&#xff08;GC&#xff09;是一個不可或缺的話題&#xff0c;尤其在面對大型應用和系統優化時顯得尤為重要。JVM的自動內存管理是Java編程語言中一項革命性的特性&#xff0c;它大大簡化了程…

測試記錄2:Ubuntu工程直接添加使用Eigen3源文件

直接將Eigen3源文件放入到工程目錄下使用&#xff0c;免安裝 1.新建空文件夾Test_eigen 2.創建將eigen下載的文件夾解壓&#xff0c;重命名為eigen3放入到Test_eigen 3.進入Test_eigen&#xff0c;創建main.cpp #include <iostream> #include <Eigen/Eigen>int m…

AI盒子在智慧加油站的應用

方案背景 為規范加油站作業&#xff0c;保障人民生命財產安全&#xff0c;《加油站作業安全規范》&#xff08;AQ 3010-2007&#xff09;中第五條規定&#xff1a;卸油作業基本要求&#xff0c;明確防靜電、防雷電、防火、人員值守、禁止其他車輛及非工作人員進入卸油區。 痛點…

數據結構基礎篇(4)

十六.循環鏈表 概念 循環鏈表是一種頭尾相接的鏈表&#xff08;最后一個結點的指針域指向頭結點&#xff0c;整個鏈表形成一個環&#xff09;優點 從表任一結點出發均可找到表中其他結點判斷終止 由于循環鏈表中沒有NULL指針&#xff0c;所以涉及遍歷操作時&#xff0c;終止條…

RocketMQ學習(2) 深入學習

RokcetMQ的介紹和基礎知識見這篇博客——RocketMQ學習(1) 快速入門 本篇為上一篇的深入學習&#xff0c;很多基礎知識不再贅述。 目錄 消息重復消費問題(去重;冪等)布隆過濾器 重試機制死信消息 SpringBoot集成RocketMQ集成SpringBoot發送不同消息模式(同步消息)異步消息單向消…

python下載指定URL的文件

import requests # 圖片的URL地址 url https://book.pep.com.cn/1212001402143/files/mobile/1.jpg?240301113921 # 發送HTTP GET請求 response requests.get(url) # 檢查請求是否成功 if response.status_code 200: # 打開一個文件用于寫入 with open(download…

實習碰到的問題w1

1.vueelementUI在輸入框中按回車鍵會刷新頁面 當一個 form 元素中只有一個輸入框時&#xff0c;在該輸入框中按下回車應提交該表單。如果希望阻止這一默認 行為&#xff0c;可以在 <el-form> 標簽上添加 submit.native.prevent 。 參考&#xff1a;element-ui 表單 form …

使用el-tab,el-tab-pane循環使用循環后不顯示下劃線問題

在vue項目中使用element-UI el-tab里的el-tab-pane是循環出來的&#xff0c;但是循環出來后選中tab不顯示下劃線了 文章目錄 問題問題展示效果問題代碼問題原因 解決方案解決后效果解決方案1代碼 解決方案2代碼 問題 問題展示效果 問題代碼 <el-tabs v-model"activeNa…

音量的對數表示與浮點數表示

音量用浮點數&#xff08;float&#xff09;和對數&#xff08;logarithmic scale&#xff09;表示各有特點和應用場景 浮點數&#xff1a;直接使用線性刻度表示音量&#xff0c;例如在0.0&#xff08;最小音量&#xff09;到1.0&#xff08;最大音量&#xff09;的范圍內。對…

『 Linux 』緩沖區(萬字)

文章目錄 &#x1f9a6; 什么是緩沖區&#x1f9a6; 格式化輸入/輸出&#x1f9a6; 刷新策略&#x1fab6; 塊緩沖(fully buffered)&#x1fab6; 無緩沖(unbuffered)&#x1fab6; 行緩沖(line buffered) &#x1f9a6; 現象解釋&#x1f9a6; exit()與_exit()&#x1f9a6; 進…

list 的實現

目錄 list 結點類 結點類的構造函數 list的尾插尾刪 list的頭插頭刪 迭代器 運算符重載 --運算符重載 和! 運算符重載 * 和 -> 運算符重載 list 的insert list的erase list list實際上是一個帶頭雙向循環鏈表,要實現list,則首先需要實現一個結點類,而一個結點需要…

【代碼隨想錄——回溯算法——四周目】

1.重新安排行程 1.1 我的代碼&#xff0c;超時通不過 var (used []boolpath []stringres []stringisFind bool )func findItinerary(tickets [][]string) []string {sortTickets(tickets)res make([]string, len(tickets)1)path make([]string, 0)used make([]bool,…

JSON Web Token

JWT 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一種用于在各方之間作為JSON對象安全地傳輸信息的開放標準&#xff08;RFC 7519&#xff09;。該信息經過數字簽名&#xff0c;因此是可驗證和可信的。JWT 可以使用HMAC算法或使用RSA的公鑰/私鑰對進行簽名 JWT的…

微信小程序 vant Picker組件default-index不生效的解決辦法

1、原始的寫法以及問題 <van-popup show"{{ showPopup && cellClick Freq }}" position"bottom" bind:close"onPopupClose"><van-picker value-key"Spec" show-toolbar title"{{cellClick Freq ? showPcCha…

win10鍵盤按亂了,如何恢復?

今天鍵盤被寶寶給按亂了&#xff0c;好不容易給重新調整回來&#xff0c;記錄備忘&#xff1a; 1、win10的asdf和方向鍵互換了&#xff1a; 使用Fnw鍵來回切換&#xff0c;OK&#xff01; 2、鍵盤的win鍵失效&#xff0c;例如&#xff1a;按winD無法顯示桌面。此時&#xf…

Day30

Day30 CSS CSS常用樣式 font-family:“微軟雅黑” -設置字體 font-size: 50px -設置字體大小 font-style : italic-設置字體風格 font-weight:bolder -設置字體粗細 color: white-設置字體顏色 letter-spacing: 20px-設置文本內容的間隔 text-decoration :underline - 設置劃…

電動汽車電子系統架構

電動汽車的普及正在穩步發展&#xff0c;供應鏈的各個環節也在發生變化。它涵蓋了制造電動汽車零件的原材料、化學品、電池和各種組件。與此同時&#xff0c;汽車充電基礎設施也參與其中&#xff0c;它們正經歷一個歷史性的階段&#xff0c;經過徹底的重新設計。它們的電氣化以…

Wpf 使用 Prism 實戰開發Day30

登錄界面設計 一.準備登錄界面圖片素材&#xff08;透明背景圖片&#xff09; 1.把準備好的圖片放在Images 文件夾下面&#xff0c;格式分別是.png和.ico 2.選中 login.png圖片鼠標右鍵&#xff0c;選擇屬性。生成的操作選擇>資源 3.MyTodo 應用程序右鍵&#xff0c;屬性&a…

如何修改開源項目中發現的bug?

如何修改開源項目中發現的bug&#xff1f; 目錄 如何修改開源項目中發現的bug&#xff1f;第一步&#xff1a;找到開源項目并建立分支第二步&#xff1a;克隆分支到本地倉庫第三步&#xff1a;在本地對項目進行修改第四步&#xff1a;依次使用命令行進行操作注意&#xff1a;Gi…