Qt中QProxyStyledrawControl函數4個參數的意義

Qt中QProxyStyle::drawControl函數4個參數的意義

我們來詳細解釋一下 Qt 中 QProxyStyle::drawControl 函數的四個參數。

這個函數是 Qt 樣式系統中的一個核心方法,用于繪制標準 UI 元素(如按鈕、復選框、菜單欄等)。當你繼承 QProxyStyle 并重寫此函數時,你是在告訴 Qt 如何繪制這些控件。

void QProxyStyle::drawControl(ControlElement element,const QStyleOption *option,QPainter *painter,const QWidget *widget) const

1. ControlElement element

  • 類型QStyle::ControlElement (一個枚舉類型)
  • 意義指定要繪制的控件類型
    這個參數告訴 drawControl 函數當前需要繪制的是什么具體的 GUI 元素。Qt 定義了大量的標準控件元素,例如:
    • CE_PushButton: 繪制一個按鈕(如 QPushButton)。
    • CE_CheckBox: 繪制復選框的指示器部分。
    • CE_RadioButton: 繪制單選框的指示器部分。
    • CE_ComboBoxLabel: 繪制組合框(QComboBox)的文本標簽。
    • CE_MenuItem: 繪制菜單中的一項。
    • CE_ProgressBar: 繪制進度條。
    • CE_TabBarTab: 繪制標簽欄(QTabBar)中的一個標簽。
    • … 以及很多其他元素(完整列表請參閱 Qt 文檔中的 QStyle::ControlElement)。
  • 用法: 在你的重寫函數中,你通常會使用一個 switch 語句來根據不同的 element 值進行不同的繪制操作。對于你不想自定義的元素,你應該調用基類(即 QProxyStyleQCommonStyle)的實現,讓它們來處理。
void MyCustomStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{switch (element) {case CE_PushButton:// 我的自定義按鈕繪制代碼drawMyCustomButton(option, painter, widget);break;case CE_CheckBox:// 我的自定義復選框繪制代碼drawMyCustomCheckbox(option, painter, widget);break;default:// 對于所有其他我不關心的控件,交給父類(代理的樣式或默認樣式)處理QProxyStyle::drawControl(element, option, painter, widget);break;}
}

2. const QStyleOption *option

  • 類型const QStyleOption*

  • 意義包含繪制控件所需的所有狀態和信息
    這是一個非常重要的參數,它是一個基類指針,通常指向某個 QStyleOption 的子類。你需要將其轉換(qstyleoption_cast)為正確的子類來獲取具體的繪制信息。

    不同控件元素(element)對應不同的 QStyleOption 子類:

    • 繪制 CE_PushButton 時,option 通常指向 QStyleOptionButton
    • 繪制 CE_ProgressBar 時,option 通常指向 QStyleOptionProgressBar
    • … 以此類推。

    這些 QStyleOption 子類包含了諸如:

    • rect: 控件需要被繪制的矩形區域。
    • palette: 控件應該使用的調色板(顏色組)。
    • state: 控件的狀態標志(如 State_Enabled, State_HasFocus, State_MouseOver, State_Sunken 等)。
    • 以及子類特有的信息,如按鈕的文本(text)、圖標(icon),進度條的進度(progress)等。
  • 用法: 在繪制代碼中,你需要先進行安全的類型轉換,然后從轉換后的對象中讀取信息。

case CE_PushButton: {// 安全地將基類指針轉換為 QStyleOptionButton*const QStyleOptionButton *buttonOption = qstyleoption_cast<const QStyleOptionButton*>(option);if (buttonOption) {// 現在可以使用 buttonOption->text, buttonOption->rect 等信息QString text = buttonOption->text;QRect rect = buttonOption->rect;bool isPressed = (buttonOption->state & State_Sunken); // 檢查按鈕是否被按下// ... 繪制邏輯}break;
}

3. QPainter *painter

  • 類型QPainter*
  • 意義執行實際繪制操作的“畫筆”
    這個 QPainter 對象已經設置好了,目標設備(通常是 QWidget 的繪圖表面)和坐標系統也已經配置完成。你所有的繪制命令(如 drawRect, drawText, drawPixmap)都通過這個對象來完成。
  • 用法: 你直接使用這個 painteroption->rect 指定的區域內進行繪制。你可以設置它的畫筆(pen)、畫刷(brush)、字體(font)等屬性。
painter->save(); // 保存當前狀態
painter->setRenderHint(QPainter::Antialiasing); // 設置抗鋸齒if (isPressed) {painter->setBrush(pressedBrush); // 設置按下狀態的畫刷
} else {painter->setBrush(normalBrush); // 設置正常狀態的畫刷
}
painter->setPen(outlinePen); // 設置輪廓畫筆
painter->drawRoundedRect(buttonRect, 5, 5); // 繪制一個圓角矩形painter->setFont(buttonFont);
painter->setPen(textColor);
painter->drawText(buttonRect, Qt::AlignCenter, text); // 繪制文本painter->restore(); // 恢復保存的狀態

4. const QWidget *widget

  • 類型const QWidget*
  • 意義(可選)與繪制操作相關聯的控件
    這個參數可能是一個 nullptr,也可能是指向正在被繪制的實際 QWidget 的指針。它主要用于獲取控件特有的額外信息,這些信息可能沒有包含在通用的 QStyleOption 結構中。
  • 用法: 當你需要獲取控件的一些特定屬性或調用其方法時(盡管在 const 方法中很有限),這個參數就很有用。例如,你可以檢查控件是否具有某些自定義屬性。
if (widget) {// 例如,檢查控件是否有一個自定義屬性來決定是否要特殊繪制if (widget->property("mySpecialStyle").toBool()) {drawSpecialVariant(option, painter);return;}// 或者,你可以獲取控件的對象名稱等元信息用于調試// qDebug() << "Drawing for widget:" << widget->objectName();
}

注意: 由于這個函數是 const 的,并且 widgetconst 指針,你不能通過它來修改控件。

總結

參數意義用途
element“畫什么?”指定要繪制的控件類型(按鈕、復選框等)。
option“用什么狀態畫?”提供控件的大小、狀態、文本等所有必要信息。
painter“用什么工具畫?”提供執行實際繪制命令(畫矩形、文字等)的工具。
widget“為誰畫?”(可選)提供控件本身的引用,用于獲取更高級或特定的信息。

通過組合使用這四個參數,你可以完全自定義 Qt 應用程序中幾乎所有標準控件的外觀。QProxyStyle 的妙處在于,你只需要重寫你想改變的部分,對于其他控件,可以輕松地委托給底層的基礎樣式(如 Fusion, Windows 等)來處理。

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

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

相關文章

idf-esp32 PWM呼吸燈(LEDC頭文件)

相關宏和變量#define LED_PIN GPIO_NUM_3 #define LEDC_CHANNEL LEDC_CHANNEL_0 #define LEDC_TIMER LEDC_TIMER_0 #define LEDC_MODE LEDC_LOW_SPEED_MODE #define LEDC_DUTY_RES LEDC_TIMER_13_BIT // 2^13 8192級亮度 #define LEDC_FREQUENCY 50…

PLC_博圖系列?基本指令”S_ODTS:分配保持型接通延時定時器參數并啟動“

PLC_博圖系列?基本指令”S_ODTS&#xff1a;分配保持型接通延時定時器參數并啟動“ 文章目錄PLC_博圖系列?基本指令”S_ODTS&#xff1a;分配保持型接通延時定時器參數并啟動“背景介紹S_ODTS&#xff1a; 分配保持型接通延時定時器參數并啟動說明參數脈沖時序圖示例關鍵字&a…

OneCode 可視化揭秘系列(三):AI MCP驅動的智能工作流邏輯編排

OneCode 可視化揭秘系列&#xff08;三&#xff09;&#xff1a;AI MCP驅動的智能工作流邏輯編排 引言 在前兩篇系列博文中&#xff0c;我們詳細探討了OneCode可視化動作的基礎配置與界面設計&#xff0c;以及組件交互與數據流管理。在本篇文章中&#xff0c;我們將深入剖析邏輯…

TypeORM、Sequelize、Hibernate 的優缺點對比:新手常見 SQL 與 ORM 踩坑總結

1. ORM 與關系型數據庫&#xff08;MySQL、PostgreSQL&#xff09; 的使用 SQL 語句編寫&#xff08;JOIN、GROUP BY、索引使用、事務控制&#xff09;與 ORM 映射&#xff08;如 Sequelize、TypeORM、Hibernate&#xff09;之間的差異會讓新手非常糾結&#xff1b;尤其是理解…

JavaScript 創建型設計模式詳解

1. 單例模式1.1. 使用場景在前端開發中&#xff0c;全局狀態管理、配置信息、數據庫連接等往往需要在應用中只存在一個實例&#xff0c;避免多次實例化帶來的數據不一致性。例如&#xff0c;在一個前端應用中&#xff0c;全局的 loading 狀態通常需要一個單例模式來確保其唯一性…

k8s除了主server服務器可正常使用kubectl命令,其他節點不能使用原因,以及如何在其他k8s節點正常使用kubectl命令??

kubectl 并不是“只能”在主節點&#xff08;Control Plane Node&#xff09;使用&#xff0c;而是因為它需要訪問 Kubernetes 的 kube-apiserver&#xff0c;而 kube-apiserver 通常只在主節點上運行并監聽內部網絡。簡單來說kubectl 需要連接 kube-apiserver&#xff01;&…

Custom SRP - Complex Maps

https://catlikecoding.com/unity/tutorials/custom-srp/complex-maps/1 創建材質球我們的材質已經支持光照,并且支持 Albedo 和 Emission 貼圖.創建材質球,并應用下面的電路板的圖分別作為 albedo emission設置材質球的金屬度為 1 , 光滑度為 0.952 Mask Map在 albedo 圖上的不…

repo 學習教程

你現在會用 git 了&#xff0c;接下來學 repo&#xff08;Google 推出來的多倉庫管理工具&#xff09;&#xff0c;其實就是在 Git 的基礎上做了一層封裝&#xff0c;方便同時管理很多 Git 倉庫。像 Android 源碼、Rockchip 全套 SDK 都是靠 repo 來拉取和管理的。 我給你分幾個…

[SWERC 2020] Safe Distance題解

[SWERC 2020] Safe Distance 題意 給定 NNN 個點與一個坐標 (X,Y)(X,Y)(X,Y)&#xff0c;求從點 (0,0)(0,0)(0,0) 到點 (X,Y)(X,Y)(X,Y) 規劃一條路線&#xff0c;不能走出 (0,0)(0,0)(0,0) 與 (X,Y)(X,Y)(X,Y) 間形成的矩形&#xff0c;使得通過這條路線時距離最近的點的距離…

Rewind-你人生的搜索引擎

本文轉載自&#xff1a;Rewind-你人生的搜索引擎 - Hello123工具導航 ** 一、&#x1f50d; Rewind 是什么&#xff1f;你的數字記憶增強神器 Rewind 是一款人工智能驅動的個人記憶助手&#xff0c;就像為你配備了一個「數字第二大腦」。它能自動記錄、保存并索引你在電腦和手…

開發小點 - 存

開發小點 1.Req注解 EqualsAndHashCode(callSuper true) Data public class BillSituationReq extends BillQueryReq {/*** Whether to display the ring ratio, default is not displayed*/ApiModelProperty("Whether to Display YoY Comparison")private Boolean …

只會npm install?這5個隱藏技巧讓你效率翻倍!

原文鏈接&#xff1a;https://mp.weixin.qq.com/s/nijxVWj-E5U08DX2fl3vgg最近有個剛學前端的小伙伴問我&#xff1a;“為什么我的node_modules這么大&#xff1f;為什么別人裝依賴那么快&#xff1f;npx到底是啥玩意兒&#xff1f;” 相信不少人都跟他一樣&#xff0c;對npm的…

(二).net面試(static)

文章目錄項目地址一、基礎501.1 new keyword1.2 static class vs. static method1. static class2. static method3. static constructor 靜態構造函數4. 靜態成員的生命周期1.3 LinQ1.what is LinQ2. List<T>、IEnumerable<T>、IQueryable<T>3. 在數據庫里用…

docker,本地目錄掛載

理解Docker本地目錄掛載的基本概念Docker本地目錄掛載允許容器與宿主機共享文件或目錄&#xff0c;實現數據持久化和實時交互。掛載方式分為bind mount和volume兩種&#xff0c;前者直接映射宿主機路徑&#xff0c;后者由Docker管理存儲路徑。本地目錄掛載的核心方法bind mount…

IO多路復用相關知識

select、poll、epoll 在傳入的性能差異是不是體現在&#xff0c;當有新的連接過來&#xff0c;此時需要將新的fd傳入到內核中&#xff0c;但是poll/select需要出入整個數組&#xff0c;而epoll方式只需要出入單個fd&#xff1f; 1. select/poll 的情況它們沒有內核中“長期保存…

【CF】Day139——雜題 (絕對值變換 | 異或 + 二分 | 隨機數據 + 圖論)

B. Meeting on the Line題目&#xff1a;思路&#xff1a;數形結合首先考慮如果沒有 t 的影響該怎么寫顯然我們就是讓最大時間最小化&#xff0c;那么顯然選擇最左端點和最右端點的中間值即可&#xff0c;即 (mi mx) / 2&#xff0c;那么現在有了 t 該怎么辦我們不妨考慮拆開絕…

在 Ubuntu 上安裝和配置 PostgreSQL 實錄

一、查看ubuntu版本 lsb_release -a postgresq盡量安裝在新的穩定版本的ubuntu上 二、安裝postgresql 2.1 直接安裝 sudo apt install postgresql 結果如下 2.2 使用PPA源安裝 Ubuntu官方源提供了PostgreSQL的PPA(Personal Package Archive),通過PPA源安裝可以確保獲取…

WebGIS三維可視化 + 數據驅動:智慧煤倉監控系統如何破解煤炭倉儲行業痛點

目錄 一、項目背景&#xff1a;煤炭倉儲管理的痛點與轉型需求 二、建設意義&#xff1a;從 “被動管理” 到 “主動掌控” 的價值躍遷 三、項目核心&#xff1a;技術架構與核心目標的深度融合 四、數據與技術&#xff1a;系統穩定運行的 “雙支柱” &#xff08;一&#x…

使用 Spring Security 實現 OAuth2:一步一步的操作指南

前言 OAuth 是一種授權框架&#xff0c;用于創建權限策略&#xff0c;并允許應用程序對用戶在 HTTP 服務&#xff08;如 GitHub 和 Google&#xff09;上的賬戶進行有限訪問。它的工作原理是允許用戶授權第三方應用訪問他們的數據&#xff0c;而無需分享他們的憑證。本文將指導…

VMware共享文件夾設置

啟用共享文件夾 編輯虛擬機設置-選項-共享文件夾&#xff0c;上面的選項選擇啟用下面點擊添加一個路徑&#xff0c;跟著向導走 設置共享文件夾在主機的路徑&#xff0c;和文件夾名稱添加完成后可以點擊這個共享文件夾條目&#xff0c;查看屬性虛擬機里安裝vm-tools sudo apt up…