Qt開發經驗 --- Qt 修改控件樣式的方式(16)

文章目錄

    • @[toc]
    • 1 概述
    • 2 Qt Style Sheets (QSS)
    • 3 使用 QStyle 和 QProxyStyle
    • 4 設置 Palette (調色板)
    • 5 使用預定義的 QStyle
    • 6 直接設置控件屬性
    • 7 自定義控件繪制

更多精彩內容
👉內容導航 👈
👉Qt開發經驗 👈

1 概述

Qt 提供了多種修改控件樣式的方式,以下是主要的幾種方法:

各方法的特點對比

方法優點缺點適用場景
QSS簡單易用,類似CSS,可集中管理性能略低,調試困難快速界面美化,
大部分UI樣式需求
QStyle性能好,控制精確復雜,需了解繪制細節深度定制外觀
Palette簡單,性能好功能有限,主要控制顏色簡單顏色修改
屬性設置直觀,易理解零散,不易維護單個控件快速調整
自定義繪制(paintEvent)完全控制復雜,維護困難特殊UI需求

推薦使用策略

  1. 簡單樣式調整:使用 QSS
  2. 整體風格定制:使用 QStyle 或 QProxyStyle
  3. 顏色主題切換:使用 Palette
  4. 特殊控件外觀:自定義繪制
  5. 項目級樣式管理:QSS 文件 + 資源系統

2 Qt Style Sheets (QSS)

Qt樣式表是最常用和靈活的樣式修改方式,語法類似于CSS。

使用方式

  • 全局應用:通過 QApplication::setStyleSheet()

  • 窗口級別:通過 QWidget::setStyleSheet()

  • 控件級別:直接對特定控件設置樣式

// 直接在代碼中設置
QPushButton *button = new QPushButton("按鈕");
button->setStyleSheet("QPushButton {""background-color: blue;""color: white;""border-radius: 5px;""padding: 10px;""}");// 或者應用到整個應用程序
QApplication::setStyleSheet("QPushButton { background-color: red; }");

3 使用 QStyle 和 QProxyStyle

通過繼承或代理 QStyle 來改變控件的繪制方式:

   // 使用 QProxyStyle 自定義樣式class CustomStyle : public QProxyStyle{public:void drawControl(ControlElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const override{if (element == CE_PushButton) {// 自定義按鈕繪制邏輯} else {QProxyStyle::drawControl(element, option, painter, widget);}}};// 應用樣式QApplication::setStyle(new CustomStyle);

4 設置 Palette (調色板)

通過修改控件的調色板來改變顏色:

QPalette palette;
palette.setColor(QPalette::Button, QColor(255, 0, 0));      // 按鈕背景色
palette.setColor(QPalette::ButtonText, QColor(255, 255, 255)); // 按鈕文字顏色QPushButton *button = new QPushButton("按鈕");
button->setPalette(palette);
button->setAutoFillBackground(true);  // 必須啟用自動填充背景

5 使用預定義的 QStyle

Qt 提供了幾種內置樣式:

  // 設置系統默認樣式QApplication::setStyle(QStyleFactory::create("Fusion"));     // 現代風格QApplication::setStyle(QStyleFactory::create("Windows"));    // Windows 風格QApplication::setStyle(QStyleFactory::create("Macintosh"));  // Mac 風格// 或者為特定控件設置樣式widget->setStyle(QStyleFactory::create("Windows"));

6 直接設置控件屬性

通過控件自身的屬性方法設置外觀:

  QPushButton *button = new QPushButton("按鈕");button->setStyleSheet("background-color: red; color: white;");  // 樣式表button->setFont(QFont("Arial", 12, QFont::Bold));              // 字體button->setFixedSize(100, 30);                                 // 大小button->setCursor(Qt::PointingHandCursor);                     // 光標

7 自定義控件繪制

重寫控件的 paintEvent() 方法:

   class CustomWidget : public QWidget{protected:void paintEvent(QPaintEvent *event) override{QPainter painter(this);painter.setBrush(Qt::blue);painter.drawRect(rect());// 自定義繪制邏輯}};

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

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

相關文章

Vue3》》Svg圖標 封裝和使用

SVG 安裝插件 npm i vite-plugin-svg-icons // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import { resolve } from path export default defineConfig({//配置路徑別…

【04】AI輔助編程完整的安卓二次商業實戰-尋找修改替換新UI首頁圖標-菜單圖標-消息列表圖標-優雅草伊凡

【04】AI輔助編程完整的安卓二次商業實戰-尋找修改替換新UI首頁圖標-菜單圖標-消息列表圖標-優雅草伊凡引言本次二開布局沒有變,但是下一次整體布局會有變,不過本次開發發現朋友圈跳轉功能的流程步驟也做了一定的變化。原生項目復雜就復雜于就算一個顏色…

龍蜥8.10中spark各種集群及單機模式的搭建spark3.5.6(基于hadoop3.3.6集群)

先說最終的訪問端口,如我這里ip為172.20.94.37、172.20.94.38、172.20.94.39,主機名分別為:hadoop37、hadoop38、hadoop39. 最終訪問(默認端口): hadoop webui 172.20.94.37:9870 hdfs 端口 8020 yarn 172.…

關于我重新學習 react 的第一遍

今天是25年9月11號,很久很久沒有學習前端知識了,坦誠來說還清楚記得在大學里因為前端技術第一次獲獎的心情,也清晰記得寫完第一篇博客后的心情,工作和運動給我最大程度的成就感。 打破自己 重新開始 完全地 版本一 25.9.11 文章目…

第2課:Agent系統架構與設計模式

第2課:Agent系統架構與設計模式 課程目標 理解Agent的基本概念和特性掌握多Agent系統的設計模式學習Agent通信協議和消息傳遞實踐創建簡單的Agent框架 課程內容 2.1 Agent基礎概念 什么是Agent? Agent是一個具有自主性、反應性、社會性和主動性的計…

Day42 51單片機中斷系統與8×8 LED點陣掃描顯示

day42 51單片機中斷系統與88 LED點陣掃描顯示一、51單片機引腳位操作 —— sbit 關鍵字 作用 sbit 是專用于 51 單片機架構的 C 語言擴展關鍵字,用于定義特殊功能寄存器(SFR)中的某一位,從而實現對單個 I/O 引腳的直接位操作。 示…

差分: 模板+題目

題目:【模板】差分 應用場景:快速解決將某一個區間所有元素加上 “一個數” 的操作。 第一步,預處理差分數組。 f[i] 表示:當前元素與前一個元素的差值 a[i] - a[i-1]; 但在題目中,我們其實可以不用到a[]這個數組…

GD32 Timer+ADC多通道+DMA+PWM調試記錄

本例記錄使用GD32307C開發板,實現以內部Timer1 CH1為觸發源,觸發ADC0的兩個通道,進行并行非連續采樣,病通過DMA傳輸采樣結果。同時輸出PWM,用來檢測Timer1 CH1的觸發周期。下面介紹具體實現過程:1. gpio初始…

阻塞 IO為什么叫BIO,非阻塞IO為什么叫NIO,異步IO為什么叫AIO

IOIO的核心就是數據傳輸,也就是程序與外部設備之間進行傳輸,通過IO的核心可以分為,文件IO和網絡IO文件IO交互的對象就是本地存儲設備,比方說讀寫本地文件。網絡IO交互的對象就是網絡設備,核心的應用場景就是網絡通信。…

10分鐘了解什么是多模態大模型

10分鐘了解什么是多模態大模型(MM-LLMs) 1. 什么是多模態 Multimodality 多模態(Multimodality)是指集成和處理兩種或兩種以上不同類型的信息或數據的方法和技術。在機器學習和人工智能領域,多模態涉及的數據類型通常…

通過DSL生成Jenkins流水線

代碼化管理 Jenkins 流水線(Infrastructure as Code) 版本控制:DSL 腳本可以像代碼一樣存入 Git、GitLab 等版本控制系統,所有任務配置的變更都有提交記錄,便于追溯歷史、回滾錯誤。協作效率:團隊成員可以通…

信號量主要API及綜合應用

1.信號量概述信號量是一個底層核心模塊【int】類型變量,記錄當前信號量數據。信號量 P 操作 (sem_wait)線程檢測對應信號量底層 int 數據數值,如果大于 0,當前線程獲得 CPU 執行權,同時將信號量底層 int 數據-1 操作。如果底層數據…

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構 文章目錄 工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構引言:當普通PLC遇到性能瓶頸第一章:認識TDC——它不是簡單的“大型PLC”1.1 TDC究竟是什…

MySQL高階查詢語句與視圖實戰指南

MySQL高階查詢語句與視圖實戰指南 文章目錄MySQL高階查詢語句與視圖實戰指南一、常用高階查詢技巧1. 按關鍵字排序(ORDER BY)基礎用法進階用法:多字段排序條件過濾2. 區間判斷與去重(AND/OR DISTINCT)區間判斷&#x…

解決Pytest參數化測試中文顯示亂碼問題:兩種高效方法

在使用Pytest進行參數化測試時,許多開發者都會遇到一個常見但令人頭疼的問題:當測試用例的ids參數包含中文字符時,控制臺輸出會出現亂碼。這不僅影響了測試報告的可讀性,也給測試結果的分析帶來了困難。本文將深入探討這個問題&am…

基于SpringBoot的校園流浪動物救助平臺【spring boot實戰項目、Java畢設、Java項目、Java實戰】

💖💖作者:計算機畢業設計小途 💙💙個人簡介:曾長期從事計算機專業培訓教學,本人也熱愛上課教學,語言擅長Java、微信小程序、Python、Golang、安卓Android等,開發項目包括…

利用kimi k2編寫postgresql協議服務端的嘗試

美團龍貓還是很有自知之明的 提問請用C編寫postgresql協議服務端,能接收psql客戶端或其他采用postgresql協議的工具的請求,實現將用戶請求打印在控制臺,并把回應發給客戶端回答 抱歉,我無法為您編寫完整的 PostgreSQL 協議服務端。…

醫療 AI 再突破:輔助診斷準確率超 90%,但落地醫院仍面臨數據安全與臨床信任難題

一、引言(一)醫療 AI 發展背景在數字化與智能化浪潮的席卷下,醫療領域正經歷著深刻變革,人工智能(AI)技術的融入成為這場變革的關鍵驅動力。近年來,醫療 AI 輔助診斷技術取得重大突破&#xff0…

Rocky Linux10.0安裝zabbix7.4詳細步驟

安裝Rocky Linux10.0系統 請參考Rocky Linux10.0安裝教程-CSDN博客 查看當前系統版本 cat /etc/*release 安裝數據庫 安裝zabbix之前,需要先安裝一個數據庫來承載zabbix的數據。這里我選擇在本機直接安裝一個MariaDB數據庫。 Rocky Linux10.0系統默認不包含MySQ…

JDBC插入數據

文章目錄視頻:JDBC插入數據環境準備寫插入數據屬性配置屬性配置視頻:JDBC插入數據 環境準備 MySQL環境 小皮面板 提供MySQL環境 寫插入數據 屬性配置 聲明變量 屬性配置 # . properties 是一個特俗的map 集合 # key : 字符串 value : 字符串…