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

2024-03-06 01:28

本文主要是介绍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"));//在矩形里加载图片

这篇关于qt学习:QPaintEvent绘图事件+QPainter画家的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/778423

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二