QT——自定义控件绘图

一.QPaintEvent绘图事件

QPaintEvent是QT中一个重要的类,专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时,就会产生该事件,通常发生在以下几种情况。

  • 窗口第一次显示时:当窗口或控件第一次出现在屏幕中,系统或窗口就会生成QPaintEvent事件,通知窗口进行自身的绘制
  • 窗口大小改变时:当用户改变窗口的大小时,窗口中的内容通常需要重新绘制以适应新的尺寸
  • 窗口部分被遮挡后又重新显示时:如果窗口被其他窗口遮挡,然后又重新露出来,被遮挡的部分通常需要重新绘制
  • 手动请求重绘:通过调用QWidget的update()或repaint()方法,可以手动触发重绘事件。在Qt应用程序中,通常通过重写QWidget的paintEvent(QPaintEvent*)方法来处理绘制逻辑。

在Qt应用程序中,通常通过重写QWidget的paintEvent(QPaintEvent*)方法来处理绘制逻辑。

二.QPainter画家

2.1绘制基本图形

QPainter是Qt库中用于在屏幕上进行绘画的类。它提供了各种绘制功能,比如画线、画图形、画文本等。

1.初始化QPainter:首先,您需要一个QPaintDevice,比如一个QWidget或QPixmap,然后使用它来初始化QPainter对象。

QPainter painter(this); //假设在QWidget的子类中

2.设置画笔和画刷:您可以设置画笔(用于描边)和画刷(用于填充)的颜色、样式等。

/*QPen pen(Qt::green, 4);
painter.setPen(pen);*/painter.setPen(Qt::blue);                             //设置画笔颜色为蓝色
painter.setBrush(Qt::yellow);                         //设置画刷颜色为黄色(填充色)
painter.setRenderHint(QPainter::Antialiasing, true);  //启用抗锯齿

3.绘制图形:使用QPainter的方法来绘制线条、矩形、圆形、文本等。

painter.drawLine(10, 10, 100, 100);         //1.画线
painter.drawLine(QLine(10, 10, 100, 100));
painter.drawLine(QPoint(10, 10), QPoint(100, 100));painter.drawRect(10, 10, 100, 100);         //2.画矩形
painter.drawRect(QRect(10, 10, 100, 100));painter.drawText(10, 10, "Hello, Qt!");     //3.画文本
painter.drawText(QPoint(10,10), "Hello, Qt!");
//在屏幕正中央画文本
painter.drawText(rect().center(), "Hello, Qt!");painter.drawEllipse(QRect(10,10,100,100));  //4.在矩形区域内画圆形或椭圆
painter.drawEllipse(10,10,100,100);
painter.drawEllipse(QPoint(20,30), 80, 80);painter.drawRect(QRect(20,20,200,100));     //5.在矩形区域内画扇形
painter.drawPie(QRect(20,20,200,100), 45*16, 90*16);
painter.drawPie(QRect(20,20,200,100), -45*16, -90*16);
//第二个参数是起始角度,第三个参数是跨度

 QT中是以1/16度为基本单位的,起始角度和跨度同时为正是逆时针绘制,同时为负是顺时针绘制

起始角度:0       跨度:180        起始角度:45      跨度:135      起始角度:0      跨度:360

 

2.2渐变色

1.线性渐变

QLinearGradient是Qt框架中用于创建线性渐变的类。线性渐变是一种从一个颜色平滑过渡到另一个颜色的效果,其变化沿着两个点之间的直线进行。这种渐变在图形用户界面设计中非常常见,用于添加深度、立体感或动态效果。

1. 创建 QLinearGradient 对象:指定渐变的起点和终点坐标。

从左上顶点到右下顶点进行渐变

QLinearGradient gradient(QPointF(10, 10), QPointF(50, 50));

 从左边到右边进行渐变(图形的最左边的中间部分开始到最右边的中间部分结束)

QLinearGradient gradient(QPoint(100,110), QPoint(200, 110));

2. 设置颜色停靠点:在渐变线上定义颜色和相应的位置。可以设置多个颜色停靠点来创建更复杂的渐变效果.

// 设置颜色停靠点:在渐变线上定义颜色和相应的位置
gradient.setColorAt(0.0, Qt::red);    // 起点颜色为红色
gradient.setColorAt(0.5, Qt::green);  // 中间颜色为绿色
gradient.setColorAt(1.0, Qt::blue);   // 终点颜色为蓝色

3. 使用渐变创建一个QPen(边框为渐变色)或QBrush(填充为渐变色),然后绘制图形

QPen pen;
pen.setBrush(gradient);
pen.setWidth(4); // 设置线条宽度
painter.setPen(pen);// 绘制渐变色边框的矩形
painter.drawRect(10, 10, 200, 200);
// 使用渐变创建 QPen
painter.setBrush(gradient);
painter.setPen(Qt::noPen());// 绘制渐变色边框的矩形
painter.drawRect(10, 10, 200, 200);

                  

2.径向渐变

QRadialGradient是Qt框架中用于创建径向渐变的类。径向渐变是一种从中心点向外部辐射的颜色渐变,通常在中心点有一种颜色,而向外围渐渐变化为另一种颜色。这种渐变非常适合用于模拟光源、阴影或创建圆形的立体感。

1.创建QRadialGradient对象:指定渐变的中心点、半径以及焦点(可选)。

2.设置颜色停靠点:在径向渐变中定义颜色和对应的位置。

3.使用渐变创建QBrush:利用QRadialGradient对象创建一个QBrush,然后用它在QPainter中进行绘制。

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); // 启用抗锯齿// 创建对象,设置中心点、半径和焦点(可选)
QRadialGradient gradient(rect().center(), 100);// 设置颜色停靠点:在径向渐变中定义颜色和对应的位置
gradient.setColorAt(0.0, QColor(255, 206, 232));  // 中间颜色淡粉色
gradient.setColorAt(1.0, QColor(255, 155, 170));  // 边缘为深粉色// 使用渐变创建 QBrush
painter.setBrush(gradient);
painter.drawEllipse(rect().center(), 100, 100);  // 绘制圆形

3.圆锥形渐变

QConicalGradient是Qt框架中用于创建圆锥形渐变的类。圆锥渐变是一种渐变效果,其中颜色沿着圆锥的轮廓变化,类似于旋转颜色轮。这种渐变以其中心点为基点,颜色沿圆周分布,可以创建出富有动感的视觉效果。

在使用时,角度是按照顺时针方向测量的,起始点(0度)通常在三点钟方向。QConicalGradient非常适合用于创建旋转或动态效果的图形,例如加载指示器、进度条或任何需要圆周颜色变化的场景。

1. 创建 QConicalGradient 对象: 指定渐变的中心点和起始角度。

2. 设置颜色停靠点:为渐变添加不同的颜色和对应的位置(角度)。

3. 使用渐变创建 QBrush:使用这个渐变对象来创建一个 QBrush,然后应用到 QPainter 中进行绘图。

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); // 启用抗锯齿// 1. 创建 QConicalGradient 对象:指定渐变的中心点和起始角度。
QConicalGradient gradient(width() / 2, height() / 2, 0);// 2. 设置颜色停靠点:为渐变添加不同的颜色和对应的位置(角度)。
gradient.setColorAt(0.0, QColor(255, 182, 193));    // 中心颜色为浅粉色
gradient.setColorAt(0.5, QColor(255, 160, 122));    // 中间颜色为浅橙色
gradient.setColorAt(1.0, QColor(173, 216, 230));    // 边缘颜色为浅蓝色
// 3. 使用渐变创建 QBrush:使用这个渐变对象来创建一个 QBrush,然后应用到 QPainter 中进行绘图。
painter.setBrush(gradient);
painter.drawEllipse(rect());                        // 绘制圆形

      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python · Pytorch】人工神经网络 ANN(上)

【Python Pytorch】人工神经网络 ANN(上) 0. 生物神经网络1. 人工神经网络定义2. 人工神经网络结构2.1 感知机2.2 多层感知机2.3 全连接神经网络2.4 深度神经网络 2. 训练流程※ 数据预处理 (Data Preprocessing) 3. 常见激活函数3.1 Sigmoid / Logisti…

【Redis_Day2】在Linux中安装Redis5

本篇涉及Linux中的三条指令:su;apt;vim,可以了解后再来浏览本篇。或在评论留言。 【Redis_Day2】在Linux中安装Redis5 安装修改配置文件使用redis-cli连接服务器 安装 Linux版本选择Ubuntu22.04 Redis版本选择Redis5 登录Ubunt…

第1篇 引言

一、AIGC概念 1、AIGC定义 AIGC,即生成式人工智能(Artificial Intelligence Generated Content),是指利用人工智能技术自动生成或辅助创作内容的过程和结果。 简单来说:过去,写文章、画张图、唱首歌、弄个…

深度学习---------------------------------Transformer

目录 Transformer架构多头注意力有掩码的多头注意力基于位置的前馈网络层归一化信息传递预测总结代码多头注意力使用多个头并行计算选择缩放点积注意力作为每一个注意力头测试该部分总代码Transformer基于位置的前馈网络改变张量的最里层维度的尺寸对比不同维度的层归一化和批量…

世界时区划分

1. AoE (Anywhere on Earth)代表地球上最后一个时区的时间,是全球范围内最晚的时间,通常用于截止日期。 2. UTC/GMT (协调世界时/格林威治时间)是全球的标准时间,所有时区都是基于UTC计算的。…

qt QImage详解

1、概述 QImage是Qt框架中用于处理图像数据的一个核心类。与QPixmap不同,QImage是在内存中直接存储图像像素数据的,这使得它适用于需要直接访问和修改像素的应用场景,比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…

DAY75WEB 攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类

知识点: 1、验证码简单机制-验证码过于简单可爆破 2、验证码重复使用-验证码验证机制可绕过 3、验证码智能识别-验证码图形码被可识别 4、验证码接口调用-验证码触发接口可枚举 图片验证码-识别插件-登录爆破&接口枚举 验证码识别绕过等技术适用于&#x…

字符串左旋 (干货无废话)

题目内容:实现一个函数,可以左旋字符串中的k个字符 例如:ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 画图解释: 上图分别是向左挪1次,2次,3次,4次,5次后的结果…

QML基础语法2

函数 函数格式: function关键字 函数名(参数名1:参数类型,参数名2:参数类型,...):返回值类型{} 其中: 函数名必须以小写字符开头,后面驼峰可以有多个参数或者没有参数参数类型可以不写返回值类型也可以不写 如何调用:通过id点…

Mac 配置SourceTree集成云效

1、背景 工作使用的是自己的笔记本,一个是比较卡,在一个是敏感信息比较多还是使用公司的电脑,但是系统是Mac就很麻烦,在网上找了帖子记录一下 2、配置 打开终端 ssh-keygen -t rsa #一直回车就行 cd .ssh cat id_rsa.pub #查…

Kubernetes中常见的volumes数据卷

华子目录 volumesk8s支持的卷的类型emptyDir卷功能emptyDir的使用场景示例 hostPath卷功能用法安全隐患示例 nfs卷功能应用示例:部署一台nfs服务器并在所有k8s节点中安装nfs-utils volumes 容器中文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序…

PaddleNLP的FAQ问答机器人

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DDRNet模型创新实现人像分割】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

Windows的MySQL开机自动启动问题

标题 问题描述 问题描述 在Windows系统中,我设置好了MySQL服务为自动启动,但在开机后发现MySQL服务任没有自动运行。我有点苦恼,每次连接MySQL,都要进入计算机管理,手动打开。 解决方法: 1.前提安装好MySQ…

基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大,容错率…

计算机毕业设计 | 基于SpringBoot的健身房管理系统(附源码)

1,项目背景 随着人们生活水平的提高和健康意识的增强,健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求,需要一种更加高效、智能、安全的管理系…

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)

【LetMeFly】685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图) 力扣题目链接:https://leetcode.cn/problems/redundant-connection-ii/ 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点&…

前端请求后端接口报错(blocked:mixed-content),以及解决办法

报错原因:被浏览器拦截了,因为接口地址不是https的。 什么是混合内容(Mixed Content) 混合内容是指在同一页面中同时包含安全(HTTPS)和非安全(HTTP)资源的情况。当浏览器试图加载非…

SMTP协议,即简单邮件传输协议

SMTP协议,即简单邮件传输协议(Simple Mail Transfer Protocol),是一种用于发送电子邮件的互联网标准。以下是对SMTP协议的详细介绍: 一、定义与工作原理 SMTP定义了邮件服务器之间以及邮件客户端与服务器之间的通信规…

Xss_less靶场攻略(1-18)

xss-lab-less1 ur特殊字符转义 存在url中 转义符为 %2B& 转义符为 %26空格 转义符为 或 %20/ 转义符为 %2F? 转义符为 %3F% 转义符为 %25#转义符为 %23 转义符为 %3Dimg 标签懒加载 在XSS攻击中,img标签的src属性是一个常见的攻击向量,因为它可以…

Unity humanoid 模型头发动画失效问题

在上一篇【Unity实战笔记】第二十二 提到humanoid 模型会使原先的头发动画失效,如下图所示: 头发摆动的是generic模型和动画,不动的是humanoid模型和动画 一开始我是尝试过在模型Optimize Game objects手动添加缺失的头发骨骼的,奈…