QT:QPen、QBrush、與圖形抗鋸齒的關聯

QPen

QPen 是 Qt 框架中用于定義繪圖時使用的畫筆屬性的類。在使用 QPainter 進行 2D 繪圖時,QPen 可以控制線條的外觀,比如線條的顏色、寬度、樣式(如實線、虛線等)、端點樣式(如方形端點、圓形端點等)和連接樣式(如斜接、圓角連接等)。

主要屬性

顏色(QColor):用于指定線條的顏色。可以使用預定義的顏色(如 Qt::red、Qt::blue 等),也可以自定義 RGB 值。
寬度(qreal):指定線條的寬度,單位通常是像素。
樣式(Qt::PenStyle):定義線條的樣式,例如實線(Qt::SolidLine)、虛線(Qt::DashLine)、點線(Qt::DotLine)等。
端點樣式(Qt::PenCapStyle):確定線條端點的外觀,如方形端點(Qt::SquareCap)、圓形端點(Qt::RoundCap)等。
連接樣式(Qt::PenJoinStyle):用于設置兩條線條連接處的樣式,如斜接(Qt::MiterJoin)、圓角連接(Qt::RoundJoin)等。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QPainterPath>class PenExampleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 創建不同屬性的 QPen 對象并繪制線條// 1. 紅色實線,寬度為 2 像素QPen pen1(Qt::red);pen1.setWidth(2);painter.setPen(pen1);painter.drawLine(20, 20, 200, 20);// 2. 藍色虛線,寬度為 3 像素QPen pen2(Qt::blue);pen2.setWidth(3);pen2.setStyle(Qt::DashLine);painter.setPen(pen2);painter.drawLine(20, 50, 200, 50);// 3. 綠色點線,寬度為 4 像素,圓形端點QPen pen3(Qt::green);pen3.setWidth(4);pen3.setStyle(Qt::DotLine);pen3.setCapStyle(Qt::RoundCap);painter.setPen(pen3);painter.drawLine(20, 80, 200, 80);// 4. 紫色實線,寬度為 5 像素,圓角連接QPen pen4(Qt::magenta);pen4.setWidth(5);pen4.setJoinStyle(Qt::RoundJoin);QPainterPath path;path.moveTo(20, 110);path.lineTo(100, 110);path.lineTo(100, 200);painter.setPen(pen4);painter.drawPath(path);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);PenExampleWidget widget;widget.setWindowTitle("QPen Example");widget.resize(300, 250);widget.show();return app.exec();
}

頭文件包含:
QApplication:管理 Qt 應用程序的資源和事件循環。
QWidget:作為窗口的基類。
QPainter:用于實際的繪圖操作。
QPen:用于定義畫筆的屬性。
自定義窗口類 PenExampleWidget:
繼承自 QWidget,并重寫 paintEvent 函數,在該函數中進行繪圖操作。
paintEvent 函數:
紅色實線:創建 pen1,設置顏色為紅色,寬度為 2 像素,然后使用 painter.setPen(pen1) 設置畫筆,最后繪制一條水平直線。
藍色虛線:創建 pen2,設置顏色為藍色,寬度為 3 像素,樣式為虛線(Qt::DashLine),再設置畫筆并繪制直線。
綠色點線:創建 pen3,設置顏色為綠色,寬度為 4 像素,樣式為點線(Qt::DotLine),端點樣式為圓形(Qt::RoundCap),然后繪制直線。
紫色實線及圓角連接:創建 pen4,設置顏色為紫色,寬度為 5 像素,連接樣式為圓角連接(Qt::RoundJoin)。使用 QPainterPath 創建一個路徑,包含兩條線段,最后使用設置好的畫筆繪制該路徑。
主函數:
創建 QApplication 對象,啟動應用程序。
創建 PenExampleWidget 實例,設置窗口標題和大小,并顯示窗口。
調用 app.exec() 進入事件循環,等待用戶操作。
在這里插入圖片描述

看到窗口中繪制了四條不同樣式的線條,直觀展示了 QPen 不同屬性的效果。

QBrush

QBrush 是 Qt 框架中用于定義填充圖案和顏色的類,在使用 QPainter 進行 2D 繪圖時,QBrush 可用于填充各種圖形(如矩形、橢圓等),控制圖形內部的顏色和填充樣式。

主要屬性

顏色(QColor):指定填充的顏色,可以使用預定義的顏色(如 Qt::red、Qt::blue 等),也可以通過 RGB 值自定義顏色。
樣式(Qt::BrushStyle):定義填充的樣式,常見的樣式有:
Qt::SolidPattern:實心填充,使用指定的顏色完全填充圖形。
Qt::Dense1Pattern - Qt::Dense7Pattern:不同密度的疏密填充圖案。
Qt::HorPattern、Qt::VerPattern、Qt::CrossPattern 等:水平、垂直、交叉等線條圖案。
漸變(QGradient):除了純色填充,QBrush 還支持使用漸變填充,如線性漸變(QLinearGradient)、徑向漸變(QRadialGradient)和錐形漸變(QConicalGradient)。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QBrush>
#include <QLinearGradient>class BrushExampleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 1. 實心填充QBrush solidBrush(Qt::red, Qt::SolidPattern);painter.setBrush(solidBrush);painter.drawRect(20, 20, 100, 100);// 2. 疏密填充QBrush denseBrush(Qt::blue, Qt::Dense3Pattern);painter.setBrush(denseBrush);painter.drawRect(140, 20, 100, 100);// 3. 線性漸變填充QLinearGradient linearGradient(20, 140, 120, 140);linearGradient.setColorAt(0.0, Qt::green);linearGradient.setColorAt(1.0, Qt::yellow);QBrush gradientBrush(linearGradient);painter.setBrush(gradientBrush);painter.drawRect(20, 140, 100, 100);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);BrushExampleWidget widget;widget.setWindowTitle("QBrush Example");widget.resize(260, 260);widget.show();return app.exec();
}

頭文件包含
QApplication:管理 Qt 應用程序的資源和事件循環。
QWidget:作為窗口的基類。
QPainter:用于實際的繪圖操作。
QBrush:用于定義填充的屬性。
QLinearGradient:用于創建線性漸變。
2. 自定義窗口類 BrushExampleWidget
繼承自 QWidget,并重寫 paintEvent 函數,在該函數中進行繪圖操作。
3. paintEvent 函數
實心填充:
創建 solidBrush,使用紅色(Qt::red)和實心填充樣式(Qt::SolidPattern)。
使用 painter.setBrush(solidBrush) 設置畫刷,然后使用 painter.drawRect 繪制一個矩形,該矩形將被紅色實心填充。
疏密填充:
創建 denseBrush,使用藍色(Qt::blue)和 Qt::Dense3Pattern 疏密填充樣式。
設置畫刷并繪制另一個矩形,該矩形將顯示為藍色的疏密填充效果。
線性漸變填充:
創建 linearGradient 線性漸變對象,設置起始點和結束點,以及漸變的顏色停止點(從綠色到黃色)。
使用 gradientBrush 畫刷將線性漸變應用到填充中。
設置畫刷并繪制第三個矩形,該矩形將顯示為從綠色到黃色的線性漸變填充效果。
4. 主函數
創建 QApplication 對象,啟動應用程序。
創建 BrushExampleWidget 實例,設置窗口標題和大小,并顯示窗口。
調用 app.exec() 進入事件循環,等待用戶操作。

在這里插入圖片描述

看到窗口中繪制了三個矩形,分別展示了實心填充、疏密填充和線性漸變填充的效果。

與圖形抗鋸齒的關聯

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>class AntialiasingExampleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 不開啟抗鋸齒繪制橢圓QPen pen1(Qt::red, 2);QBrush brush1(Qt::yellow, Qt::SolidPattern);painter.setPen(pen1);painter.setBrush(brush1);painter.drawEllipse(20, 20, 100, 100);// 開啟抗鋸齒繪制橢圓painter.setRenderHint(QPainter::Antialiasing);QPen pen2(Qt::blue, 2);QBrush brush2(Qt::green, Qt::SolidPattern);painter.setPen(pen2);painter.setBrush(brush2);painter.drawEllipse(150, 20, 100, 100);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);AntialiasingExampleWidget widget;widget.setWindowTitle("Antialiasing Example");widget.resize(300, 150);widget.show();return app.exec();
}

包含了必要的 Qt 頭文件,分別用于管理應用程序、創建窗口、進行繪圖操作、設置
AntialiasingExampleWidget
繼承自 QWidget 并重寫 paintEvent 函數,在該函數中進行繪圖操作。
創建一個紅色、寬度為 2 像素的 QPen 和一個黃色實心填充的 QBrush,然后使用 QPainter 在坐標 (20, 20) 處繪制一個寬度和高度均為 100 的橢圓,此時未開啟抗鋸齒功能。
接著,使用 setRenderHint(QPainter::Antialiasing) 開啟抗鋸齒功能。創建一個藍色、寬度為 2 像素的 QPen 和一個綠色實心填充的 QBrush,然后在坐標 (150, 20) 處繪制另一個寬度和高度均為 100 的橢圓。
創建 QApplication 對象來管理應用程序,創建 AntialiasingExampleWidget 窗口實例,設置窗口標題和大小,顯示窗口并進入應用程序的事件循環。
在這里插入圖片描述
看到窗口中繪制了兩個橢圓,開啟抗鋸齒的橢圓邊緣會更加平滑,而未開啟抗鋸齒的橢圓邊緣可能會有鋸齒狀。

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

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

相關文章

論文筆記(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的獎勵中心化4 案例研究&#xff1a; 以獎勵為中心的 Q-learning5 討論、局限性與未來工作致謝 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…

單例模式——c++

一個類&#xff0c;只能有1個對象 (對象在堆空間) 再次創建該對象&#xff0c;直接引用之前的對象 so構造函數不能隨意調用 so構造函數私有 so對象不能構造 如何調用私有化的構造函數: 公開接口調用構造函數 調用構造函數&#xff1a;singleTon instance&#xff1b; 但…

ReentrantLock 底層實現

一、核心概念 1 - CAS CAS&#xff08;Compare-And-Swap&#xff0c;比較并交換&#xff09;操作是一種無鎖的原子操作&#xff0c;它在多線程環境下能夠保證線程安全&#xff0c;主要是通過硬件級別的原子性以及樂觀鎖的思想來實現的。以下詳細介紹 CAS 操作保證線程安全的原…

NLP學習記錄十:多頭注意力

一、單頭注意力 單頭注意力的大致流程如下&#xff1a; ① 查詢編碼向量、鍵編碼向量和值編碼向量分別經過自己的全連接層&#xff08;Wq、Wk、Wv&#xff09;后得到查詢Q、鍵K和值V&#xff1b; ② 查詢Q和鍵K經過注意力評分函數&#xff08;如&#xff1a;縮放點積運算&am…

算法-二叉樹篇08-完全二叉樹的節點個數

完全二叉樹的節點個數 力扣題目鏈接 題目描述 給你一棵 完全二叉樹 的根節點 root &#xff0c;求出該樹的節點個數。 完全二叉樹 的定義如下&#xff1a;在完全二叉樹中&#xff0c;除了最底層節點可能沒填滿外&#xff0c;其余每層節點數都達到最大值&#xff0c;并且最下…

【原創工具】同文件夾PDF文件合并 By憐渠客

【原創工具】同文件夾PDF文件合并 By憐渠客 原貼&#xff1a;可批量合并多個文件夾內的pdf工具 - 吾愛破解 - 52pojie.cn 他這個存在一些問題&#xff0c;并非是軟件內自主實現的PDF合并&#xff0c;而是調用的pdftk這一工具&#xff0c;但樓主并沒有提供pdftk&#xff0c;而…

微軟云和金山云和k8有什么區別

Kubernetes&#xff08;K8s&#xff09;和微軟云&#xff08;Microsoft Cloud&#xff09;是兩種不同的技術&#xff0c;分別用于不同的目的。Kubernetes是一個開源的容器編排系統&#xff0c;用于自動化部署、擴展和管理容器化應用程序&#xff0c;而微軟云是一個提供多種云服…

libGL.so.1: cannot open shared object file: No such file or directory-linux022

in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 這個錯誤信息表示XXXX 在啟動時遇到問題&#xff0c;缺少 libGL.so.1 文件。libGL.so.1 是與 OpenGL 圖形庫相關的共…

滲透測試【seacms V9】

搭建seacms環境 我選擇在虛擬機中用寶塔搭建環境 將在官網選擇的下載下來的文件解壓后拖入寶塔面板的文件中 創建網站 添加站點 搭建完成seacmsV9 找到一個報錯口 代碼分析 <?php set_time_limit(0); error_reporting(0); $verMsg V6.x UTF8; $s_lang utf-8; $dfDbn…

論文閱讀筆記:Continual Forgetting for Pre-trained Vision Models

論文閱讀筆記&#xff1a;Continual Forgetting for Pre-trained Vision Models 1 背景2 創新點3 方法4 模塊4.1 問題設置4.2 LoRA4.3 概述4.4 GS-LoRA4.5 損失函數 5 效果6 結論 1 背景 出于隱私和安全考慮&#xff0c;如今從預先訓練的視覺模型中刪除不需要的信息的需求越來…

車載DoIP診斷框架 --- 連接 DoIP ECU/車輛的故障排除

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

【爬蟲基礎】第二部分 爬蟲基礎理論 P1/3

上節內容回顧&#xff1a;【爬蟲基礎】第一部分 網絡通訊 P1/3-CSDN博客 【爬蟲基礎】第一部分 網絡通訊-Socket套接字 P2/3-CSDN博客 【爬蟲基礎】第一部分 網絡通訊-編程 P3/3-CSDN博客 爬蟲相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff…

Compose 手勢處理,增進交互體驗

Compose 手勢處理&#xff0c;增進交互體驗 概述常用手勢處理Modifierclickable()combinedClickable()draggable()swipeable()transformable()scrollable()nestedScrollNestedScrollConnectionNestedScrollDispatcher 定制手勢處理使用 PointerInput ModifierPointerInputScope…

ue5 3dcesium中從本地配置文件讀取路3dtilles的路徑

關卡藍圖中獲得3dtiles的引用 拉出設置url 設置路徑 至于設置的路徑從哪里來 可以使用varest讀取文件里的接送字符串 path中配置地址 path變量的值為: Data/VillageStartMapConfig.json此地址代表content的地下的data文件夾里的config.json文件 {"FilePath": &quo…

音視頻入門基礎:RTP專題(12)——RTP中的NAL Unit Type簡介

一、引言 RTP封裝H.264時&#xff0c;RTP對NALU Header的nal_unit_type附加了擴展含義。 由《音視頻入門基礎&#xff1a;H.264專題&#xff08;4&#xff09;——NALU Header&#xff1a;forbidden_zero_bit、nal_ref_idc、nal_unit_type簡介》可以知道&#xff0c;nal_unit…

搜索賦能:大型語言模型的知識增強與智能提升

引言 近年來&#xff0c;大型語言模型&#xff08;LLM&#xff09;取得了顯著的進展&#xff0c;并在各個領域展現出強大的能力。然而&#xff0c;LLM也存在一些局限性&#xff0c;尤其是在知識庫方面。由于訓練數據的局限性&#xff0c;LLM無法獲取最新的知識&#xff0c;也無…

EX_25/2/24

寫一個三角形類&#xff0c;擁有私有成員 a,b,c 三條邊 寫好構造函數初始化 abc 以及 abc 的set get 接口 再寫一個等腰三角形類&#xff0c;繼承自三角形類 1&#xff1a;寫好構造函數&#xff0c;初始化三條邊 2&#xff1a;要求無論如何&#xff0c;等腰三角形類對象&#x…

nv docker image 下載與使用命令備忘

1&#xff0c;系統需求 Requirements for GPU Simulation GPU Architectures Volta, Turing, Ampere, Ada, Hopper NVIDIA GPU with Compute Capability 7.0 CUDA 11.x (Driver 470.57.02), 12.x (Driver 525.60.13) Supported Systems CPU architectures x86_64, ARM…

學習記錄:初次學習使用transformers進行大模型微調

初次使用transformers進行大模型微調 環境&#xff1a; 電腦配置&#xff1a; 筆記本電腦&#xff1a;I5&#xff08;6核12線程&#xff09; 16G RTX3070&#xff08;8G顯存&#xff09; 需要自行解決科學上網 Python環境&#xff1a; python版本:3.8.8 大模型&#xff1a…

【Java學習】Object類與接口

面向對象系列五 一、引用 1.自調傳自與this類型 2.類變量引用 3.重寫時的發生 二、Object類 1.toString 2.equals 3.hashCode 4.clone 三、排序規則接口 1.Comparable 2.Comparator 一、引用 1.自調傳自與this類型 似復刻變量調用里面的非靜態方法時&#xff0c;都…