【Qt QSS樣式設置】

Qt中的QSS樣式設置流程

Qt Style Sheets (QSS) 是Qt框架中用于自定義控件外觀的樣式表語言,其語法類似于CSS。以下是QSS的設置流程和示例。

QSS設置流程

1. 創建QSS樣式表文件或字符串

首先,需要創建QSS樣式表,可以是一個單獨的.qss文件,或者直接在代碼中以字符串形式定義。

2. 加載和應用樣式表

有幾種方式可以加載和應用樣式表:

方式A:全局應用(應用到整個應用程序)
#include <QApplication>
#include <QFile>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 從文件加載樣式表QFile styleFile(":/styles/style.qss");styleFile.open(QFile::ReadOnly);QString styleSheet = QLatin1String(styleFile.readAll());app.setStyleSheet(styleSheet);// 或者直接使用字符串// app.setStyleSheet("QPushButton { background-color: red; }");// 創建和顯示窗口// ...return app.exec();
}
方式B:應用到特定控件
// 創建控件后應用樣式
QPushButton *button = new QPushButton("Click me");
button->setStyleSheet("background-color: blue; color: white;");
方式C:應用到控件類型
// 應用到所有QPushButton
qApp->setStyleSheet("QPushButton { background-color: green; }");

3. 樣式表重載和更新

如果需要動態更新樣式,可以重新調用setStyleSheet()方法。

QSS語法基礎

選擇器類型

  1. 通用選擇器* - 匹配所有控件
  2. 類型選擇器QPushButton - 匹配所有QPushButton實例
  3. 類選擇器.QPushButton - 匹配所有QPushButton實例
  4. ID選擇器QPushButton#okButton - 匹配objectName為"okButton"的QPushButton
  5. 屬性選擇器QPushButton[flat="true"] - 匹配flat屬性為true的QPushButton
  6. 子控件選擇器QComboBox::drop-down - 匹配QComboBox的下拉箭頭
  7. 偽狀態選擇器QPushButton:hover - 匹配鼠標懸停狀態的QPushButton

常用屬性

  • background, background-color
  • color (文本顏色)
  • border, border-radius
  • font, font-family, font-size
  • padding, margin
  • min-width, min-height
  • image, background-image

完整示例

示例1:簡單的按鈕樣式

#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);QPushButton *button1 = new QPushButton("普通按鈕");QPushButton *button2 = new QPushButton("主要按鈕");QPushButton *button3 = new QPushButton("禁用按鈕");button3->setEnabled(false);layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);// 設置樣式表QString styleSheet = R"(/* 所有按鈕的基礎樣式 */QPushButton {padding: 8px 16px;border: 2px solid #ccc;border-radius: 4px;background-color: #f0f0f0;color: #333;font-family: Arial;font-size: 14px;}/* 懸停狀態 */QPushButton:hover {background-color: #e0e0e0;border-color: #999;}/* 按下狀態 */QPushButton:pressed {background-color: #d0d0d0;}/* 特定按鈕樣式 */QPushButton#mainButton {background-color: #007acc;color: white;border-color: #005a9e;}QPushButton#mainButton:hover {background-color: #0062ab;}/* 禁用狀態 */QPushButton:disabled {background-color: #f8f8f8;color: #aaa;border-color: #ddd;})";// 設置對象名以便使用ID選擇器button2->setObjectName("mainButton");// 應用樣式表window.setStyleSheet(styleSheet);window.resize(300, 200);window.show();return app.exec();
}

示例2:使用外部QSS文件

  1. 創建樣式表文件 style.qss:
/* style.qss */
QMainWindow {background-color: #f5f5f5;
}QPushButton {padding: 10px 20px;border: none;border-radius: 4px;background-color: #4CAF50;color: white;font-weight: bold;
}QPushButton:hover {background-color: #45a049;
}QPushButton:pressed {background-color: #3d8b40;
}QLineEdit {padding: 8px;border: 1px solid #ccc;border-radius: 4px;background-color: white;
}QLineEdit:focus {border-color: #4CAF50;
}QLabel {color: #333;font-size: 14px;
}
  1. 在代碼中加載外部QSS文件:
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QFile>int main(int argc, char *argv[])
{QApplication app(argc, argv);QMainWindow window;QWidget *centralWidget = new QWidget(&window);QVBoxLayout *layout = new QVBoxLayout(centralWidget);QLabel *label = new QLabel("用戶名:");QLineEdit *lineEdit = new QLineEdit();QPushButton *button = new QPushButton("登錄");layout->addWidget(label);layout->addWidget(lineEdit);layout->addWidget(button);window.setCentralWidget(centralWidget);// 加載外部樣式表文件QFile styleFile(":/style.qss");if (styleFile.open(QFile::ReadOnly)) {QString styleSheet = QLatin1String(styleFile.readAll());app.setStyleSheet(styleSheet);}window.resize(300, 200);window.show();return app.exec();
}

示例3:動態切換樣式

#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QComboBox>class StyleSwitcher : public QWidget
{Q_OBJECT
public:StyleSwitcher(QWidget *parent = nullptr) : QWidget(parent){QVBoxLayout *layout = new QVBoxLayout(this);QComboBox *styleCombo = new QComboBox();styleCombo->addItem("默認樣式");styleCombo->addItem("暗色樣式");QPushButton *testButton = new QPushButton("測試按鈕");layout->addWidget(styleCombo);layout->addWidget(testButton);connect(styleCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),this, &StyleSwitcher::changeStyle);}private slots:void changeStyle(int index){QString styleSheet;if (index == 0) {// 默認樣式styleSheet = R"(QPushButton {background-color: #f0f0f0;color: #333;border: 1px solid #ccc;padding: 8px 16px;border-radius: 4px;}QPushButton:hover {background-color: #e0e0e0;})";} else {// 暗色樣式styleSheet = R"(QWidget {background-color: #333;}QPushButton {background-color: #555;color: white;border: 1px solid #666;padding: 8px 16px;border-radius: 4px;}QPushButton:hover {background-color: #666;})";}qApp->setStyleSheet(styleSheet);}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);StyleSwitcher window;window.resize(300, 200);window.show();return app.exec();
}#include "main.moc"

注意事項

  1. 樣式表優先級:后應用的樣式會覆蓋先應用的樣式,特定選擇器的樣式會覆蓋通用選擇器的樣式。

  2. 性能考慮:大量使用樣式表可能會影響性能,特別是在嵌入式設備上。

  3. 平臺差異:某些樣式在不同平臺上可能有不同的表現。

  4. 繼承:子控件不會自動繼承父控件的所有樣式屬性。

  5. 調試:如果樣式不生效,可以使用Qt Designer或Qt Creator的樣式表編輯器進行調試。

通過QSS,可以輕松地為Qt應用程序創建美觀且一致的用戶界面。

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

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

相關文章

使用 Apollo TransformWrapper 生成相機到各坐標系的變換矩陣

使用 Apollo TransformWrapper 生成相機到各坐標系的變換矩陣一、背景二、原理1、什么是變換矩陣&#xff1f;2、為什么需要變換矩陣&#xff1f;3、Apollo 中的坐標系4、Apollo TransformWrapper三、操作步驟1. 設置車輛參數2. 啟動靜態變換發布3. 查看變換信息4. 播放記錄數據…

硬件(十)IMX6ULL 中斷與時鐘配置

一、OCP 原則&#xff08;開閉原則&#xff09;對代碼擴展是開放的&#xff0c;允許通過新增代碼來擴展功能&#xff1b;對代碼的修改是關閉的&#xff0c;盡量避免直接修改已有穩定運行的代碼&#xff0c;以此保障代碼的穩定性與可維護性。二、中斷處理&#xff08;一&#xf…

打工人日報#20250913

打工人日報#20250913 周六&#xff0c;回杭州了&#xff0c;這邊居然下雨。 閱讀 《小米創業思考》 第七章 技術為本 其中的技術介紹算是比較詳細的&#xff0c;架構也很清晰&#xff0c;有一種對自己家產品如數家珍的感覺&#xff0c;對于架構也是經常思考的感覺感恩 和namwei…

【面試題】RAG核心痛點

1. 文檔切分粒度不好把控&#xff0c;既擔心噪聲太多又擔心語義信息丟失 這是一個經典難題。切分粒度過大&#xff0c;單個chunk包含過多無關信息&#xff08;噪聲&#xff09;&#xff0c;會干擾LLM理解核心內容&#xff1b;切分過小&#xff0c;則可能割裂句子或段落的完整語…

網絡安全與iptables防火墻配置

iptables基本概念iptables是Linux系統中強大的防火墻工具&#xff0c;它工作在用戶空間&#xff0c;通過命令行界面與內核空間的netfilter框架交互&#xff0c;實現數據包過濾、網絡地址轉換(NAT)等功能。Web服務器防火墻配置實例以下是針對Web服務器的iptables配置步驟&#x…

qt中給QListWidget添加上下文菜單(快捷菜單)

步驟 添加customContextMenuRequested信號的槽函數&#xff0c;添加后&#xff0c;在QListWidget上單擊右鍵&#xff0c;無法響應&#xff0c;還必須執行下面操作&#xff1b;設置QListWidget上下文菜單策略為Qt::CustomContextMenu 如下&#xff1a;

一款好看的jQuery前端框架-HisUI

HisUI&#xff1a;一款基于EasyUI的前端組件類庫&#xff0c;讓web開發更迅速、簡單。 HisUI官網文檔

【Docker】P3 入門指南:運維與開發雙重視角

目錄Docker入門&#xff1a;運維與開發運維視角Docker 架構概述Docker 鏡像鏡像概念理解查看和管理鏡像拉取鏡像鏡像標識容器管理啟動容器容器內操作容器的后臺運行多容器管理重新進入運行中的容器容器生命周期管理開發視角容器化思維示例&#xff1a;基于 Nginx 鏡像構建簡單 …

第六屆大數據、人工智能與物聯網工程國際會議(ICBAIE 2025)

重要信息 時間&#xff1a;2025年10月17-19日 地點&#xff1a;中國上海 官網&#xff1a;www.icbaie.net 征稿主題 1. 大數據與云計算 2. 人工智能技術與應用 3. 機器人科學與工程 4. 物聯網與傳感器技術 5. 其他 大數據、人工智能與物聯網 引言 在數字化轉型的時代…

Docker存儲卷(Volume)核心概念、類型與操作指南

文章目錄一、存儲卷概念二、存儲卷分類2.1 管理卷2.2 綁定數據卷2.3 臨時數據卷三、MySQL災難恢復四、存儲卷的局限性一、存儲卷概念 什么是存儲卷&#xff1f; ??Docker 存儲卷 是 Docker 容器中用于持久化存儲數據的獨立文件系統區域。它獨立于容器的聯合文件系統&#xf…

Electron 原生模塊集成:使用 N-API

引言&#xff1a;原生模塊集成在 Electron 開發中的 N-API 核心作用與必要性 在 Electron 框架的擴展開發中&#xff0c;原生模塊集成是提升應用性能和功能邊界的關鍵技術&#xff0c;特別是使用 N-API&#xff08;Node-API&#xff09;編寫和集成 C 原生模塊&#xff0c;更是 …

android組包時會把從maven私服獲取的包下載到本地嗎

Android項目在構建&#xff08;組包&#xff09;時&#xff0c;Gradle會自動將從Maven私服&#xff08;或任何配置的倉庫&#xff09;獲取的依賴包&#xff08;AAR、JAR等&#xff09;下載到本地的Gradle緩存目錄中。 下面詳細解釋這個過程和相關的概念&#xff1a; 詳細過程聲…

【應用筆記】構建具有增強識別、防欺騙和說話人識別功能的高級語音用戶界面--瑞薩電子

Suad Jusuf&#xff08;Director Product Marketing and Strategy, Renesas AI Center of Excellence&#xff09;&#xff1a;語音用戶界面&#xff08;VUI&#xff09;正在徹底改變我們與技術交互的方式&#xff0c;實現免提、無縫的通信。通過整合先進語音命令識別功能&…

DAY 26 函數專題1:函數定義與參數-2025.9.13

DAY 26 函數專題1&#xff1a;函數定義與參數 知識點回顧&#xff1a; 函數的定義變量作用域&#xff1a;局部變量和全局變量函數的參數類型&#xff1a;位置參數、默認參數、不定參數傳遞參數的手段&#xff1a;關鍵詞參數傳遞參數的順序&#xff1a;同時出現三種參數類型時…

芯昇XS9922C可替代TP9932和TP9930:國產四核高清解碼芯片,開啟車載視覺處理新紀元 ——從像素級解析到全鏈路集成,重新定義智能駕駛感知核心

引言&#xff1a;車載視覺的“芯”革命 在智能駕駛技術飛速演進的今天&#xff0c;高清視頻采集與實時處理已成為車輛環境感知的“神經中樞”。傳統解碼方案面臨傳輸距離有限、多芯片集成度低、音視頻同步難等痛點&#xff0c;制約著車載環視、盲區檢測等關鍵功能的性能突破。X…

百度競價推廣:百度搜索競價推廣代運營

在數字化營銷浪潮中&#xff0c;百度競價推廣憑借其強大的流量優勢和精準觸達能力&#xff0c;成為企業獲取客戶的核心渠道之一。然而&#xff0c;面對復雜的賬戶管理、激烈的關鍵詞競爭以及動態變化的市場環境&#xff0c;許多企業選擇將專業的事交給專業的人——通過代運營團…

開源端到端訓練多模態大模型LLaVA 深度拆解

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

排序算法(Java)

目錄 前言 常見的排序算法實現&#xff1a; 1. 冒泡排序 思路分析&#xff1a; 代碼實現&#xff1a; 2.選擇排序 思路分析&#xff1a; 代碼實現&#xff1a; 3.插入排序 思路分析&#xff1a; 代碼實現&#xff1a; 4.快速排序 思路分析&#xff1a; 代碼實現&…

深度學習打卡第N6周:中文文本分類-Pytorch實現

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、準備工作 數據格式&#xff1a; import torch from torch import nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

【代碼隨想錄day 24】 力扣 90. 集合II

視頻講解&#xff1a;https://www.bilibili.com/video/BV1vm4y1F71J/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html#%E6%80%9D%E8%B7%AF 力扣題目&#xff1a;https://leetcode.cn/problems/su…