当前位置: 首页 > 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…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...