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 Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用