qt学习:QPaintEvent绘图事件+QPainter画家

目录

QPaintEvent绘图事件

常见事件

QPainter

初始化 QPainter

设置画笔和画刷

绘制图形

结束绘制

画线  

画矩形

画圆形

画弧线

画扇形

指定画笔大小 QPen

抗锯齿

无边框

画指针  多边形

渐变色 QLinearGradient

使用步骤

示例一  线性渐变

 示例二  径向渐变

示例三  圆锥形渐变

保存当前坐标轴

旋转坐标轴

画一个图片


QPaintEvent绘图事件

常见事件

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

触发事件便会执行paintEvent(QPaintEvent *),我们可以重写QWidget 的 paintEvent(QPaintEvent *) 方法来处理绘制逻辑

protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);//上面事件就会触发这个函数}

QPainter

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

初始化 QPainter

想要绘画就要有纸才能画,纸可以是一个窗口QWidget或一个照片QPixmap

QPainter painter(this);
//this便指的是纸

设置画笔和画刷

设置描边或者填充色块

painter.setPen(Qt::blue); // 设置画笔颜色为蓝色
painter.setBrush(Qt::yellow); // 设置画刷颜色为黄色

绘制图形

设置字体、绘制线条、矩形、圆形、文本等,窗口的左上角是x和y的0点,往右x增大,往下y增大 

painter.drawLine(10, 10, 100, 100); // 画线
painter.drawRect(10, 10, 100, 100); // 画矩形
painter.setFont(QFont("Arial",30)); // 设置字体
painter.drawText(10, 10, "Hello"); // 指定位置画文本
painter.drawText(rect(), Qt::AlignCenter, "Hello"); // 窗口中间画文本如果你想一开始就在窗口画,就在触发的事件函数里画widget::paintEvent(QPaintEvent *event)

结束绘制

完成绘制后, QPainter 对象会在其析构函数中自动结束绘制

画线  

painter.drawLine(10, 10, 100, 100); 
painter.drawLine(QLine(10, 10, 100, 100)); 
painter.drawLine(QPoint(10, 10), QPoint(100, 100)); 

画矩形

QRect rec(20,100,220,200);
painter.drawRect(rec);
painter.drawRect(20,100,220,200);

画圆形

QRect rec(20,100,220,200);
painter.drawEllipse(rec);//在长方形内画椭圆
painter.drawEllipse(rect(),center(),200,100);//在窗口中间画椭圆
painter.drawEllipse(QPoint(60,500),20,20);//在窗口中间画椭圆

画弧线

正角度为逆时针,负角度为顺时针,从中间点的右边的为0°起始度

painter.drawArc(rec,30*16,120*16);//在矩形中画°弧线
painter.drawArc(30,100,200,360,30*16,120*16);//在矩形中画弧线

画扇形

painter.drawArc(30,100,200,360,30*16,120*16);//在矩形中画扇形

指定画笔大小 QPen

QPen pen(Qt::blue,8);//初始化画笔
pointer.setPen(pen);//使用画笔

抗锯齿

painter.setRenderHint(QPainter::Antialiasing,true);//开启抗锯齿

无边框

painter.setPen(Qt::NoPen);

画指针  多边形

    painter.setBrush(Qt::white);//白色笔刷painter.setPen(Qt::NoPen);//不使用任何画笔//制定多边形static const QPointF points[4] = {QPointF(0,0.0),QPointF(200.0,-1.1),QPointF(200.0,1.1),QPointF(0,15.0),};//画一个多边形//一个 QPolygonF 对象,它包含了多边形的顶点坐标  顶点数量painter.drawPolygon(points, 4);

渐变色 QLinearGradient

使用步骤

  • 创建 QLinearGradient 对象:指定渐变的起点和终点坐标
  • 设置颜色停靠点:在渐变线上定义颜色和相应的位置
  • 使用渐变创建 QBrush :用 QLinearGradient 对象来创建一个 QBrush ,然后用它在 QPainter 中进行绘制

示例一  线性渐变

     //定义画刷QPainter painter(this);//定义渐变色 起始到终点QLinearGradient lineGradient(width()/2,0,width()/2,height());//从0-1之间制定颜色lineGradient.setColorAt(0.1,QColor(0,0,0,255));lineGradient.setColorAt(0.3,QColor(0,0,0,180));lineGradient.setColorAt(0.5,QColor(0,0,0,100));lineGradient.setColorAt(1,Qt::white);//将渐变色应用到画刷上QBrush brush(lineGradient);//使用画刷painter.setBrush(brush);//画矩形painter.drawRect(rect());

 示例二  径向渐变

    //定义绘图对象QPainter painter(this);//抗锯齿painter.setRenderHint(QPainter::Antialiasing,true);//定义渐变色  窗体中间  范围200QRadialGradient radialGradient(width()/2,height()/2,20);//红到黄radialGradient.setColorAt(0.1, Qt::red);radialGradient.setColorAt(1, Qt::yellow);//将渐变色设置给绘图对象painter.setBrush(QBrush(radialGradient));//无边框painter.setPen(Qt::NoPen);//画矩形painter.drawRect(150,250,400,200);

示例三  圆锥形渐变

// 创建一个 QConicalGradient 对象
QConicalGradient conicalGradient(100, 100, 0); // 中心点 (100, 100),起始角度 0
// 添加颜色停靠点
conicalGradient.setColorAt(0.0, Qt::red);
conicalGradient.setColorAt(0.5, Qt::blue);
conicalGradient.setColorAt(1.0, Qt::red);
// 使用这个渐变创建 QBrush
QBrush brush(conicalGradient);
// 使用 QBrush 进行绘图
QPainter painter(this);
painter.setBrush(brush);
painter.setPen(Qt::NoPen); // 无边框
painter.drawRect(this->rect()); // 绘制扇形覆盖整个小部件

保存当前坐标轴

painter.save();//保存当前的坐标轴
painter.restore();//坐标轴回到保存的坐标轴

旋转坐标轴

painter.rotate(90);//顺时针旋转90°

画一个图片

    QRect rectangle(-65,radius*0.38,130,50);//画一个矩形painter.drawPixmap(rectangle,QPixmap(":/icon.png"));//在矩形里加载图片

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

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

相关文章

Java基于springboot的社区团购系统设计论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统,来满足用户团购的需求。 本社区团购系统应用Java技术,MYSQL数据库存储数据,基于Spring Boot框架开发。在网站的整个开发过程中,首先对系统进行了需求分析&…

小迪安全32WEB 攻防-通用漏洞文件上传二次渲染.htaccess变异免杀

#知识点: 1、文件上传-二次渲染 2、文件上传-简单免杀变异 3、文件上传-.htaccess 妙用 4、文件上传-PHP 语言特性 #详细点: 1、检测层面:前端,后端等 2、检测内容:文件头,完整性&#xff0c…

青蛙过河。

!!!思路和代码源自蓝桥云课大佬题解 问题描述 小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。 河里的石头排成了一条直线小青蛙每次跳跃必须落在一块石头或者岸上。 不过,每块石头有一个高度,…

【数据结构】拆分详解 - 排序

文章目录 前言一、排序的概念及其运用  1.1 排序的概念  1.2 排序的运用  1.3 常见的排序算法  1.4 排序算法性能测试对比函数 二、常见排序算法的实现  2.1 插入排序   2.1.1  基本思想   2.1.2  直接插入排序   2.1.3  希尔排序     1. 预排序&am…

特殊设计模式

▶实现一个类,不能被拷贝 ▶实现一个类,只能在堆上创建 ❗实现一个类,只能创建在栈上 ❗设计一个不能继承的类 ❗单例模式——一个类只能生成一个对象   ❔饿汉模式——在每次程序启动都会自动生成一个对象   ❓懒汉模式——在第一次需要…

学编程怎么样才能更快入手,编程怎么简单易学

学编程怎么样才能更快入手,编程怎么简单易学 一、前言 对于初学编程建议先从简单入手,然后再学习其他复杂的编程语言。 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 …

JAVA集合4-HashMap

介绍 HashMap 它实现了 Map 接口,提供了键值对的存储和检索功能。HashMap 的底层数据结构是基于哈希表实现的,JDK7 是数组链表,JDK8 是数组链表红黑 树。其中有两个重要的参数: 容量负载因子 容量的默认大小是 16,负载因子是 0…

代码随想录算法训练营第四十六天| 139.单词拆分、卡码网第56题

代码随想录算法训练营第四十六天| 139.单词拆分、卡码网第56题 139.单词拆分卡码网第56题 139.单词拆分 题目链接 文章讲解 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {int bagSize s.size(), n wordDict.size();vector<boo…

数字化转型导师坚鹏:成为数字化转型顾问 引领数字化美好未来

成为数字化转型顾问 引领数字化美好未来 ——数字化人才与企业的共赢之路 数字经济新时代&#xff0c;中国企业向数字化转型要效益&#xff1b; 转型顾问创未来&#xff0c;职场精英借数字化转型成良师。 我们中国政府特别重视数字经济发展及数字化人才培养。早在2020年8月2…

idea内置的database和chat2DB如何?

捉妖啦 最近由于某些众所周知的因素&#xff0c;要求卸载navicat,所以寻找替代品是当下任务。如果知识MySQL数据库的话&#xff0c;那替代品可太多了&#xff0c;由于使用的是MongoDB&#xff0c;所以至今没有找到一个称手的工具。 需要一款像Navicat一样&#xff0c;可以直…

什么样的跨网数据交换产品 能实现数据摆渡和数据同步?

首先&#xff0c;为什么会产生跨网数据摆渡的需求和场景呢&#xff1f;那是因为做了网络隔离&#xff0c;企业进行网络隔离的原因主要包括以下几点&#xff1a; 1、提高安全性&#xff1a;网络隔离是防止未授权访问和网络攻击的有效手段。通过将网络划分为多个独立的子网&…

L2785(Java). 将字符串中的元音字母排序

题目 1.如何以char类型便利字符串 2.自定义优先队列解决 class Solution {public String sortVowels(String s) {Map<Character,Integer> m new HashMap<>();m.put(a,1);m.put(e,1);m.put(i,1);m.put(o,1);m.put(u,1);m.put(A,1);m.put(E,1);m.put(I,1);m.put(O,…

[AIGC] 深入理解Flink中的窗口、水位线和定时器

Apache Flink是一种流处理和批处理的混合引擎&#xff0c;它提供了一套丰富的APIs&#xff0c;以满足不同的数据处理需求。在本文中&#xff0c;我们主要讨论Flink中的三个核心机制&#xff1a;窗口&#xff08;Windows&#xff09;、水位线&#xff08;Watermarks&#xff09;…

wait() 、notify()、notifyAll() 的详细用法

文章目录 &#x1f490;wait() 讲解&#x1f490;notify() 讲解&#x1f490;notifyAll()&#x1f4a1;wait() 和 sleep() 的区别 首先&#xff0c;我们知道&#xff0c;线程的执行顺序是随机的(操作系统随机调度的&#xff0c;抢占式执行)&#xff0c;但是有时候&#xff0c;我…

C语言内存池实现-对齐、重用、双向链表管理

概述 在项目上&#xff0c;经常遇到芯片内存不够导致编码困扰问题&#xff0c;在此写个笔录&#xff0c;方便后续查阅。 此示例&#xff0c;考虑了一些额外的功能和边界条件&#xff0c;例如内存分配的对齐、内存池的重用等。这个示例使用了双向链表来管理内存块。 源码如下&a…

【MySQL】视图、索引

目录 视图视图的用途优点视图的缺点创建视图查看视图修改视图删除视图注意事项 索引索引的原理索引的数据结构二分查找法Hash结构Hash冲突&#xff01;&#xff01;&#xff01; B树二叉查找树 存在问题改造二叉树——B树降低树的高度 B树特点案例继续优化的方向 改造B树——B树…

Java反射,动态代理。笔记

1.pathClass Loader 和 Dex ClassLoader 在Android 5.0以下的版本中,两者之间的区别为: DexClassLoader:可加载jar、apk和dex」可以从SD卡中加载PathClassLoader:只能加载已安裝到系統中(即/data/app目录下)的apk文件但是随着Android版本的升级,到Android …

ip https证书360元买一年送一月

随着互联网的发展&#xff0c;不论是用户还是开发者&#xff0c;都越来越重视互联网环境的安全性。IP https证书是一种网络安全协议&#xff0c;用于保护网络通信的安全性和机密性。IP https数字证书是CA认证机构为只有公网IP地址&#xff0c;没有域名的站点颁发的数字证书&…

构建信息蓝图:概念模型与E-R图的技术解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

【JavaEE进阶】CSS选择器的常见用法

CSS选择器的主要功能就是选中页面指定的标签元素&#xff0c;选中了元素&#xff0c;才可以设置元素的属性。 CSS选择器主要有以下几种: 标签选择器类选择器id选择器复合选择器通配符选择器 接下来用代码来学习这几个选择器的使用。 <!DOCTYPE html> <html lang&q…