当前位置: 首页 > news >正文

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 窗口实例,设置窗口标题和大小,显示窗口并进入应用程序的事件循环。
在这里插入图片描述
看到窗口中绘制了两个椭圆,开启抗锯齿的椭圆边缘会更加平滑,而未开启抗锯齿的椭圆边缘可能会有锯齿状。

相关文章:

QT:QPen、QBrush、与图形抗锯齿的关联

QPen QPen 是 Qt 框架中用于定义绘图时使用的画笔属性的类。在使用 QPainter 进行 2D 绘图时&#xff0c;QPen 可以控制线条的外观&#xff0c;比如线条的颜色、宽度、样式&#xff08;如实线、虚线等&#xff09;、端点样式&#xff08;如方形端点、圆形端点等&#xff09;和…...

android keystore源码分析

架构 Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元&#xff0c;以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库&#xff0c;密钥库服务使用它来提供由硬件支持的加密服…...

【12】智能合约开发入门

12-1 在线合约开发 Cloud IDE简介 基本框架 Cloud IDE是BaaS合约平台提供的在线合约开发工具 IDE是一个去中心化应用&#xff08;Dapp&#xff09;&#xff0c;通过JavaScript SDK直接与区块链平台通信&#xff0c;进行合约部署和调用 核心功能 合约工程管理 合约编辑与编…...

web安全——分析应用程序

文章目录 一、确定用户输入入口点二、确定服务端技术三、解析受攻击面 一、确定用户输入入口点 在检查枚举应用程序功能时生成的HTTP请求的过程中&#xff0c;用户输入入口点包括&#xff1a; URL文件路径 通常&#xff0c;在查询字符?之前的URL部分并不视为用户输入入口&am…...

Wpf 之Generic.xaml

在 WPF 中&#xff0c;Generic.xaml 是一个特殊的资源文件&#xff0c;它会被自动加载&#xff0c;不需要显式添加。这是 WPF 的命名约定。当 WPF 初始化自定义控件时&#xff0c;它会专门查找这个名字的文件。 这个名字是硬编码在 WPF 框架中的&#xff0c;不能改变。 Generi…...

VidSketch:具有扩散控制的手绘草图驱动视频生成

浙大提出的VidSketch是第一个能够仅通过任意数量的手绘草图和简单的文本提示来生成高质量视频动画的应用程序。该方法训练是在单个 RTX4090 GPU 上进行的&#xff0c;针对每个动作类别使用一个小型、高质量的数据集。VidSketch方法使所有用户都能使用简洁的文本提示和直观的手绘…...

解锁C# XML编程:从新手到实战高手的蜕变之路

一、引言&#xff1a;XML 在 C# 中的关键地位 在 C# 开发的广袤领域中&#xff0c;XML&#xff08;可扩展标记语言&#xff0c;eXtensible Markup Language&#xff09;宛如一颗璀璨的明星&#xff0c;占据着举足轻重的地位。它以其独特的结构化和自描述特性&#xff0c;成为了…...

kafka-leader -1问题解决

一. 问题&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分区的领导者副本尚未被选举出来&#xff0c;或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析&#xff1a; 1. 副本同步问题&#xff1a; 在 Kafka 集群中&…...

超大规模分类(四):Partial FC

人脸识别任务里&#xff0c;通常利用全连接层&#xff0c;来做人脸的分类。会面临三个实际问题&#xff1a; 真实的人脸识别数据噪声严重真实的人脸识别数据存在严重的长尾分布问题&#xff0c;一些类别样本多&#xff0c;多数类别样本少人脸类别越来越多&#xff0c;全连接层…...

uniapp 小程序如何实现大模型流式交互?前端SSE技术完整实现解析

文章目录 一、背景概述二、核心流程图解三、代码模块详解1. UTF-8解码器&#xff08;处理二进制流&#xff09;2. 请求控制器&#xff08;核心通信模块&#xff09;3. 流式请求处理器&#xff08;分块接收&#xff09;4. 数据解析器&#xff08;处理SSE格式&#xff09;5. 回调…...

因子分析详解:从理论到MATLAB实战

内容摘要&#xff1a; 本文系统解析因子分析的核心原理与MATLAB实战&#xff0c;涵盖数学模型、载荷矩阵估计、因子旋转及得分计算。通过上市公司盈利能力、消费者偏好等案例&#xff0c;演示数据标准化、因子提取与解释的全流程&#xff0c;并提供完整代码实现。深入对比因子分…...

【组态PLC】基于三菱西门子S7-200PLC和组态王液料混合系统组态设计【含PLC组态源码 M016期】

控制要求 总体控制要求&#xff1a;如面板图所示&#xff0c;本装置为三种液体混合模拟装置&#xff0c;由液面传感器SL1、SL2、SL3&#xff0c;液体A、B、C阀门与混合液阀门由电磁阀YV1、YV2、YV3、YV4&#xff0c;搅匀电机M&#xff0c;加热器H&#xff0c;温度传感器T组成。…...

js:根据后端返回的数组取出每一个数组的keyword字段然后拼接成一个逗号分隔的字符串

问&#xff1a; 现在有一个el-select&#xff0c; 后端接口返回数据为keyword:xxx,referenceNum:1,tagId:132sf32fasdfaf组成的数组&#xff0c; 现在select是多选&#xff0c; 但是但我选择多个下拉框选项后&#xff0c;后端需要前端返回的数据tagIds字段需要时一个字符串…...

基于大模型的肺纤维化预测及临床方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、大模型技术概述 2.1 大模型的基本原理 2.2 大模型在医疗领域的应用现状 三、肺纤维化相关知识 3.1 肺纤维化的病因与发病机制 3.2 肺纤维化的临床症状与诊断方法 3.3 肺纤维化的治疗现状与挑战 四、大模型…...

7. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--路由

路由是API网关的核心功能&#xff0c;对系统性能和可靠性至关重要。路由通过定义规则&#xff0c;将客户端请求准确地转发到相应的后端服务&#xff0c;确保请求能够正确处理&#xff0c;简化了微服务架构中的服务调用逻辑。有效的路由配置能够提高系统的灵活性和可维护性。 一…...

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题&#xff0c;多层循环、分支语句练习&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题&#xff0c;多层循环、分…...

监督学习——基于线性回归的波士顿房价预测:理论、实践与评估

基于线性回归的波士顿房价预测:理论、实践与评估 文章目录 基于线性回归的波士顿房价预测:理论、实践与评估一、引言二、线性回归基础理论2.1 线性回归原理2.2 线性回归在房价预测中的应用逻辑三、波士顿房价数据集介绍3.1 数据集概述3.2 特征说明3.3 目标变量四、波士顿房价…...

Selenium 调用模型接口实现功能测试

要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…...

回调函数的用法

回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数&#xff0c;接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性&#xff0c;下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...

springboot实现文件上传到华为云的obs

一、前言 有时在项目中需要使用一些存储系统来存储文件&#xff0c;那么当项目要接入obs作为存储系统时&#xff0c;就会利用obs来进行文件的上传下载&#xff0c;具体实现如下。 二、如何通过obs实现文件的上传下载&#xff1f; 1.添加相关的obs的maven依赖。 <dependency…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...