QT學習(20):QStyle類

Qt包含一組QStyle子類,這些子類(QWindowsStyle,QMacStyle等)模擬Qt支持的不同平臺的樣式,默認情況下,這些樣式內置在Qt GUI模塊中,樣式也可以作為插件提供。

Qt的內置widgets使用QStyle來執行幾乎所有的繪圖,確保其看起來與等效的原生widgets完全相同。下面展示了九種不同樣式的QComboBox。
請添加圖片描述

設置樣式

使用QApplication::setStyle()函數設置整個應用程序的樣式,也可以使用命令行選項指定。使用QWidget::setStyle()設置單個控件的樣式。如果沒有指定樣式,Qt會根據平臺或桌面環境選擇最合適的樣式。

自定義風格控件開發

開發自定義控件并且希望在所有平臺上表現一致,可以使用QStyle函數(如drawItemText()、drawItemPixmap()、drawPrimitive()、drawControl()和drawComplexControl())來執行控件繪制的一部分。

QStyle函數大部分包含4個參數:
枚舉值:指定要繪制的圖形元素的類型
QStyleOption:指定渲染元素的方式和位置
QPainter:用于繪制元素
QWidget:執行繪圖的控件

例如,如果要在小部件上繪制一個焦點矩形,可以編寫:

void MyWidget::paintEvent(QPaintEvent * /* event */)
{QPainter painter(this);QStyleOptionFocusRect option;option.initFrom(this);option.backgroundColor = palette().color(QPalette::Background);style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);
}

控件從QStyleOption中獲取呈現圖形元素所需的所有信息。QStyleOption有多個子類,表示可以用于繪制的圖形元素的類型。

為了方便,Qt提供了QStylePainter類,結合了QStyl、QPainter和QWidget,從而能夠使用

QStylePainter painter(this);
...
painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);

代替

QPainter painter(this);
...
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);

創建自定義樣式

可以通過創建自定義樣式來為應用程序創建自定義外觀。有兩種方法可以創建自定義樣式。在靜態方法中,可以對現有的QStyle類進行子類化。然后重新實現虛擬函數以提供自定義行為,或者從頭開始創建整個QStyle類。動態方法中,使用QProxyStyle,在運行時修改系統樣式的行為。

靜態方法的第一步是選擇Qt提供的樣式之一來構建自定義樣式,最常用的基類是QCommonStyle(而不是QStyle)。

根據要更改的基本樣式的部分,重新實現用于繪制界面的對應部分的函數。以修改QWindowStyle繪制的QSpinBox箭頭為例,箭頭是由drawPrimitive()函數繪制的基元元素,因此需要實現該函數。

class CustomStyle : public QProxyStyle
{Q_OBJECTpublic:CustomStyle(const QWidget *widget);~CustomStyle() {}void drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const override;
};

QSpinBox使用PE_IndicatorSpinUp和PE_IndicatorSpinDown基元元素去繪制向上和向下箭頭。

void CustomStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const
{if (element == PE_IndicatorSpinUp || element == PE_IndicatorSpinDown) {QPolygon points(3);int x = option->rect.x();int y = option->rect.y();int w = option->rect.width() / 2;int h = option->rect.height() / 2;x += (option->rect.width() - w) / 2;y += (option->rect.height() - h) / 2;if (element == PE_IndicatorSpinUp) {points[0] = QPoint(x, y + h);points[1] = QPoint(x + w, y + h);points[2] = QPoint(x + w / 2, y);} else { // PE_SpinBoxDownpoints[0] = QPoint(x, y);points[1] = QPoint(x + w, y);points[2] = QPoint(x + w / 2, y + h);}if (option->state & State_Enabled) {painter->setPen(option->palette.mid().color());painter->setBrush(option->palette.buttonText());} else {painter->setPen(option->palette.buttonText().color());painter->setBrush(option->palette.mid());}painter->drawPolygon(points);} else {QProxyStyle::drawPrimitive(element, option, painter, widget);}
}

需要注意的是,不會使用參數widget,只是將其傳遞給QWindowStyle::drawPrimitive()函數。要繪制的內容和如何繪制的信息是由QStyleOption對象指定的,與參數widget無關。如果需要使用參數widget來獲取其它信息,要在使用之前確保其不為0,并且類型是正確的。在實現自定義樣式時,不能僅僅因為枚舉值為PE_IndicatorSpinUp或PE_IndicatorSpinDown而假定控件類型是QSpinBox。

const QSpinBox *spinBox = qobject_cast<const QSpinBox *>(widget);
if (spinBox) {
...
}

使用自定義樣式

在Qt應用程序中使用自定義樣式有幾種方法。最簡單的方法是在創建QApplication之前將自定義樣式傳遞給靜態函數QApplication::setStyle()。該函數可以隨時被調用,但在構造函數之前調用,可以確保遵守使用命令行選項(-style)設置的用戶首選項。

#include <QtWidgets>#include "customstyle.h"int main(int argc, char *argv[])
{QApplication::setStyle(new CustomStyle);QApplication app(argc, argv);QSpinBox spinBox;spinBox.show();return app.exec();
}

Qt插件系統支持創建樣式作為插件,在運行時加載為共享對象。從而將自定義樣式用于其它應用程序,而無需重新編譯。

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

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

相關文章

LangChain之鏈的應用(下)

LangChain之鏈的應用 Chain鏈的應用配置LLMChain&#xff1a;簡單鏈create_stuff_documents_chain&#xff1a;文檔鏈create_extraction_chain&#xff1a;提取信息鏈LLMMathChain&#xff1a;數學鏈create_sql_query_chain&#xff1a;SQL查詢鏈連接數據庫創建并使用鏈 Sequen…

K210 數字識別 教程

一、燒寫固件 連接k210開發板&#xff0c;點開燒錄固件工具&#xff0c;選中固件&#xff0c;并下載 二、模型訓練 網站&#xff1a;MaixHub 1、上傳文件 2、開始標記數據 添加9個標簽&#xff0c;命名為1~9&#xff0c;按鍵盤w開始標記&#xff0c;鍵盤D可以下一張圖片&…

計算機網絡(1

網絡初識 目錄 網絡初識一. 網絡分類1. 局域網LAN(Local Area Network):2. 廣域網WAN(Wide Area Network): 二. 組建網絡的基礎設備1. 路由器2. 交換機 三. 標識符 協議 (protocol)一. 協議分層1. 分層的好處2. OSI七層分層3. TCP/IP五層模型(或四層) 模型(1. 物理層(可不算)(2…

6.8 LIBBPF API(七,bpf_core_read.h 函數,定義,枚舉)

一,函數 void * bpf_rdonly_cast (const void *obj, __u32 btf_id) __ksym __weak 二,定義 __CORE_RELO(src, field, info) __builtin_preserve_field_info((src)->field,BPF_FIELD_##info) __CORE_BITFIELD_PROBE_READ(dst, src, fld) bpf_probe_read_kernel( \ (v…

學習前端第四十二天(修改文檔)

1、創建一個元素 docunment.createElement( tag )&#xff1b;創建一個元素節點 let div document.createElement&#xff08;“div”&#xff09;&#xff1b;創建一個div標簽 document.createTextNode&#xff08; Text &#xff09;&#xff1b;創建一個文本節點 let t…

Windows hook介紹與代碼演示

Windows Hook 是一種機制&#xff0c;允許應用程序監視系統或處理特定事件。它可以攔截和更改消息&#xff0c;甚至可以插入到其他應用程序的消息處理機制中。Windows 提供了多種掛鉤類型&#xff0c;例如鍵盤掛鉤、鼠標掛鉤、消息掛鉤等。 hook代碼實現 下面是一個使用 Wind…

【Zotero】【MacOS】Zotero6常用插件總結

因為目前MacOS只支持Zotero6&#xff0c;所以我將網上找到的教程以及自己找到適應Zotero6版本的插件做了個整合 教程地址&#xff1a;Zotero6安裝/插件安裝教程 插件地址&#xff1a;Zotero6_Plugs

Django教程——數據庫操作(增刪改查)

在上篇文章中我們學習了Django教程——模型&#xff0c;這篇文章學習Django教程——數據庫操作&#xff08;增刪改查&#xff09;。 在學習數據庫操作之前&#xff0c;我們需要定義好模型類&#xff0c;模型類代碼如下&#xff1a; from django.db import models class UserM…

OS復習筆記ch7-1

存儲的基本管理需求 重定位 重定位(Relocation)&#xff1a;需要解決可執行文件中地址&#xff08;指令和數據&#xff09;和內存地址的對應。 一般有兩種比較常見的重定位方式&#xff1a; 靜態重定位(static relocation)&#xff1a;當程序被裝入內存時&#xff0c;一次性…

Python pdf2imges -- pdf文件轉圖片

pdf文件轉圖片&#xff0c;需要安裝PyMuPDF包&#xff0c;具體PyMuPDF包介紹可以參考&#xff1a;Python 處理 PDF 的神器 -- PyMuPDF import fitz # pip install PyMuPDF# PDF轉換為IMG統一管理 def pdf_to_images(pdf_path, img_path, filename):"""pdf_p…

Mac系統國內通過nvm快速安裝node

國內通過nvm安裝node 國內nvm安裝工具 地址&#xff1a;https://gitee.com/RubyMetric/nvm-cn 安裝命令 bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"如果按照過程中有報錯可以嘗試下載安裝腳本 在瀏覽器中打開下面的鏈接htt…

【頭歌】計算機網絡DHCP服務器配置第四關配置路由器子接口答案

頭歌計算機網絡DHCP服務器配置第四關配置路由器子接口操作步驟 任務描述 本關任務&#xff1a;配置路由器的子接口。 操作要求 在第一關的拓撲圖的基礎上&#xff0c;配置路由器及 PC 機&#xff0c;具體要求如下&#xff1a; 1、打開路由器物理接口 F0/0 &#xff1b; 2、配置…

【科普】關于Cookie的一點知識

【科普】關于Cookie的一點知識 1. Cookie的傳輸方式2. 不設置Domain時的默認邏輯3. SameSite設置為None的風險4. 通過IP訪問時如何設置Cookie 1. Cookie的傳輸方式 Cookie是通過HTTP&#xff08;超文本傳輸協議&#xff09;和HTTPS&#xff08;安全超文本傳輸協議&#xff09;…

NSSCTF中的pop、babyupload、cve版本簽到、奇妙的MD5、easy_html

目錄 [SWPUCTF 2021 新生賽]pop [NISACTF 2022]babyupload ?編輯[GKCTF 2020]cve版簽到 [SWP5UCTF 2022 新生賽]奇妙的MD5 [HNCTF 2022 Week1]easy_html 今日總結&#xff1a; [SWPUCTF 2021 新生賽]pop 1.代碼審計 <?phperror_reporting(0); show_source("…

裝機必備——360壓縮安裝教程

裝機必備——360壓縮安裝教程 軟件下載 軟件名稱&#xff1a;360壓縮 軟件語言&#xff1a;簡體中文 軟件大小&#xff1a;3.38M 系統要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系統 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下載通道①迅雷云盤丨…

Linux性能優化-網絡篇

文章目錄 前言一、網絡性能指標二、網絡基準測試如何評估系統的網絡性能各協議層的性能測試轉發性能TCP/UPD性能HTTP性能應用負載性能 三、網絡指標的獲取查詢帶寬網絡吞吐和PPS網絡連通 總結 前言 如何評價一套新環境內主機和應用的網絡性能&#xff0c;有哪些指標需要注意&a…

跳躍游戲(2)

問題描述 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 輸入&#xff1…

DINO結構中的exponential moving average (ema)和stop-gradient (sg)

DINO思路介紹 在 DINO 中&#xff0c;教師和學生網絡分別預測一個一維的嵌入。為了訓練學生模型&#xff0c;我們需要選取一個損失函數&#xff0c;不斷地讓學生的輸出向教師的輸出靠近。softmax 結合交叉熵損失函數是一種常用的做法&#xff0c;來讓學生模型的輸出與教師模型的…

Flutter 中的 AnimatedDefaultTextStyle 小部件:全面指南

Flutter 中的 AnimatedDefaultTextStyle 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;AnimatedDefaultTextStyle 是一個用于動畫化默認文本樣式的組件&#xff0c;它可以在文本顯示期間平滑地過渡文本樣式&#xff0c;如字體大小、顏色和字體族。這在實現復雜的文本…

pytorch應該安裝哪個nvcc -V 還是 nvidia-smi 對比的cuda?

當使用nvidia-smi時會顯示 cuda driver版本&#xff0c;如下&#xff1a; NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 當使用 nvcc -V 時會顯示 cuda runtime version&#xff0c;如下&#xff1a; nvcc: NVIDIA (R) Cuda compiler driver …