Qt:45---QPainter绘图
一、QPainter简介
- QPainter是Qt的二维绘图,得到的图形是不可交互的
- 画布:一般的绘图设备包括QWidget、QPixmap、QImage等,这些绘图设备为QPainter提供了一个“画布”,QPainter可以在这些设备上进行绘图
QPaintDevice、QPaintEngine类
- QPaintDevice是一个可以使用QPainter进行绘图 的抽象的二维界面
- QPaintEngine给QPainter提供在不同设备上绘图的接口
QPaintEngine类由QPainter和QPaintDevice内部使用,应用程序一般无需和QPaintEngine打交道,除非要创建自己的设备类型
二、paintEvent()、repaint()函数
paintEvent()函数
void paintEvent(QPaintEvent *event);
- 从QWidget类继承的类都有paintEvent()事件,要在设备上绘图,只需要重写此事件函数,并在函数内编写相应的绘图代码就可以了
repaint()函数
- paintEvent()函数会在应用程序启动之后执行一次,但是如果我们的绘图时的某些参数变化了,那么就需要重新绘制图片了。在指定的场景调用此函数的话,paintEvent()函数就会重新再执行一醒
三、绘图的区域
- 左上角为坐标系的起点,向右为x轴正方向,向下为y轴的正方向
- QWidget::width()函数可以获取绘图区的宽度。QWidget::height()函数可以获取绘图区的高度
- 视口和窗口:绝对此次QPainter绘图的区域范围,见文章:https://blog.csdn.net/qq_41453285/article/details/100046564
四、QPainter绘图的属性
使用下面的一些绘图工具来配合QPainter对象完成绘图,当然还有一些其他的功能结合使用,比如叠加模式、旋转、缩放等
- pen属性:是一个QPen对象,用于控制线条的颜色、宽度、线型等
- brush属性:是一个QBrush对象,用于设置一个区域的填充特性
- font属性:是一个QFont对象,用于绘制文字时,设置文字的字体样式、大小等属性
QPen、QBrush、QFont见文章:
五、相关函数
begin(); //开启本次QPainter绘图(开启不是开始)
end(); //结束本次QPainter绘图
setPen(); //设置画笔,
setFont(); //设置字体格式
setBrush(); //设置画刷
setRenderHint(QPainter::Antialiasing); //设置反锯齿
//设置组合模式,即后面绘制的图与前面绘制的图叠加模式,参数是一个QPainter::CompositionMode枚举类型(类型很多,有40多种,详情见QT帮助文档)
void QPainter::setCompositionMode(CompositionMode mode)//此函数的一个演示案例,见文章:https://blog.csdn.net/qq_41453285/article/details/100056268
- 其他函数,见其他知识点
六、QPainter绘制基本图形元件
- QPainter提供了许多绘制基本图形的功能,包括:直线、椭圆、矩形等。由这些基本的图形可以构成复杂的图形
基本图形元件
- 下面的W、H分别代表我们绘图区的宽度和高度
QPainter painter(this); int W=this->width(); int H=this->height();
- drawLine(); //画一条线
- drawImage(); //绘出一个图片
七、QPainterPath的使用
- 在上面的基本图形元件中,一般的图形元件的绘制都比较简单和直观,但是drawPath()函数是绘制一个复合的图形对象,它使用QPainterPath类型的参数作为绘图对象
drawPath()函数的原型是:
QPainterPath特点与如何使用
- QPainterPath是一系列绘图操作的顺序集合,便于重复使用
- 一个QPainterPath由许多基本的绘图操作组成,如绘图点移动、划线、画圆、画矩形等,一个闭合的QPainterPath是终点和起点连接起来的绘图路径
- 优点:绘制某些复杂形状时只需创建一个QPainterPath,然后调用QPainter::drawPath()就可以重复使用
- 例如:绘制一个复杂的星星图案需要多次调用lineto()函数,但是定义一个QPainterPath类型的变量path记录这些绘图过程,在调用drawPath(path)就可以完成星型团的绘制
相关函数:
//将当前位置移动到(x, y)并启动一个新的子路径,隐式地关闭前一个路径void QPainterPath::moveTo(const QPointF &point) void QPainterPath::moveTo(qreal x, qreal y)
//从当前位置到点(x, y)绘制一条线void QPainterPath::lineTo(const QPointF &endPoint) void QPainterPath::lineTo(qreal x, qreal y)
//关闭当前子路径,方法是在子路径的开始处画一条线,自动启动一个新路径。新路径的当前点是(0,0) void QPainterPath::closeSubpath()//将给定路径的最后一个元素添加到给定路径的第一个元素,从而将给定路径与此路径连接起来 void QPainterPath::connectPath(const QPainterPath &path)
//将给定文本作为从提供的字体创建的一组封闭子路径添加到此路径。子路径的位置使文本基线的左端位于指定的点void QPainterPath::addText(const QPointF &point, const QFont &font, const QString &text) void QPainterPath::addText(qreal x, qreal y, const QFont &font, const QString &text)
- QPainterPath提供了很多函数可以添加各种基本图形元件的绘制,其功能与QPainter提供的绘制基本图形的功能类似,也有一些用于QPainterPath的专用函数,如closeSubpath()、connectPath()等
演示案例:
- 见文章:https://blog.csdn.net/qq_41453285/article/details/100046728
八、演示案例
- 在类中重新声明paintEvent()函数(Q_DECL_OVERRIDE宏表示这个函数是对复函数虚函数的重载)
class Widget : public QWidget
{
protected:void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
};
- 构造函数
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);setPalette(QPalette(Qt::white));//设置窗口为白色背景setAutoFillBackground(true);
}
- 实现paintEvent()函数
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::TextAntialiasing);int W=this->width(); //绘图区的宽int H=this->height(); //绘图区的高QRect rect(W/4,H/4,W/2,H/2);//中间区域矩形框//设置画笔QPen pen;pen.setWidth(3);pen.setColor(Qt::red);pen.setStyle(Qt::SolidLine);pen.setCapStyle(Qt::FlatCap);pen.setJoinStyle(Qt::BevelJoin);//设置画刷QBrush brush;brush.setColor(Qt::yellow);brush.setStyle(Qt::SolidPattern);//设置painter对象的画笔和画刷属性painter.setPen(pen);painter.setBrush(brush);//开始绘制矩形(rect)painter.drawRect(rect);
}
Qt:45---QPainter绘图相关推荐
- Qt使用QPainter绘图的缩放问题
QPainter path(this); //调用画家QTransform transform; //定义画家的转换transform.translate(50,100); //画的左上角起点为(50 ...
- Qt中QPainter基本绘图
QWidget 派系的只能在paintEvent中进行重绘:如果你想要很好的交互功能的话推荐QGraphicsView框架,自定义Item的绘制在paint函数:如果你想利用线程绘制的话,你可以创建个 ...
- 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件
GitHub源码仓库:Qt学习例程 1. QPainter绘图抗锯齿 /// 抗锯齿测试 /// painter.drawEllipse(QPoint(100,50), 50, 50);// 设置 抗 ...
- 【Qt教程】3.4 - Qt5 QPainter绘图事件、绘图功能
1. QPainter绘图事件 简介 Qt的绘图系统允许使用现同的API在屏幕和其他打印设备上进行绘制.整个绘图系统基于 QPainter.QPaintDevice.QPaintEngine 三个类. ...
- Qt:46---QPainter绘图之QPen、QBrush、QFont工具
这3个工具都是用来辅助QPainter绘图的 一.QPen 功能:用于绘图时对线条进行设置,主要包括线宽.颜色.线型等 常用函数 通常一个设置函数都有一个对应的读取函数,例如setColor()用于设 ...
- 【Qt】2D绘图之图形视图框架(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...
- 【Qt】2D绘图之双缓冲绘图
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制矩形 04. 双缓冲绘图 05. 附录 01. 概述 所谓的双缓冲绘图的概念.双缓冲(double-buffers)绘 ...
- 【Qt】2D绘图之涂鸦板
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计(基本功能) 04. 程序设计(放大功能) 05. 程序设计(放大功能) 06. 附录 01. 概述 结合前面所学 ...
- 【Qt】2D绘图之窗口-视口转换
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序示例 04. 为什么要修改这个逻辑坐标矩形? 05. 窗口和视口 06. 附录 01. 概述 在使用QPainter进 ...
- 【Qt】2D绘图之复合模式
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序示例 04. 附录 01. 概述 QPainter提供了复合模式(Composition Modes)来定义如何完成数 ...
最新文章
- 【组合数学】指数型母函数 应用 ( 多重集排列问题 | 不同球放在不同盒子里 | 奇/偶数序列的指数生成函数推导 )
- 【Java】集合+I/O流+多线程の练习题+面试题
- 前端笔试之手写代码(一)
- STM32工作笔记0069---汉字显示实验
- 剑桥女博士创立情绪识别 AI 公司,帮助自闭症患者理解他人表情
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
- 【读书笔记】Java基础学习之目录
- 110个oracle常用函数总结(7),oracle110个最常用函数
- 计算机odbc数据源管理位置,ODBC 常见数据源配置整理
- 即时通讯 音视频 开发技术
- word利用宏批量调整图片大小
- 物联网4G工业路由器在森林烟火监测的应用
- cad2016中选择全图字体怎么操作_cad教程分享CAD如何替换找不到的原文字体?
- IoT Analytics:物联网2020年回顾,十大重要进展
- 企业为什么做不好生产计划?
- 拼音反查(转自大富翁)
- 【NOJ1149】【算法实验四】旅游预算
- 计算机三级数据库技术知识点
- C语言程序设计--体测成绩信息管理系统
- SHIF算法原理分析
热门文章
- linux更新字体库失败,wps for linux 字体库缺失问题的解决办法
- ArcGIS数据生产与精细化制图之中国年降水量分布图的制作
- 不清楚Word如何批量转PDF?快来跟我学这两个妙招
- PowerMILL宏自动化编程视频教程
- 小米10获取root权限_安卓刷机搞机小能手必备的三款root神器 最后一款你肯定用过...
- Jlink20P接口定义
- FreeSWITCH之默认端口
- 图灵 计算机 ppt,人工智能导论(ppt 155页)
- SVN版本管理的回滚(SmartSVN)
- 基于深度学习的视频质量分析 深度学习视频质量诊断 图像质量诊断