一、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绘图相关推荐

  1. Qt使用QPainter绘图的缩放问题

    QPainter path(this); //调用画家QTransform transform; //定义画家的转换transform.translate(50,100); //画的左上角起点为(50 ...

  2. Qt中QPainter基本绘图

    QWidget 派系的只能在paintEvent中进行重绘:如果你想要很好的交互功能的话推荐QGraphicsView框架,自定义Item的绘制在paint函数:如果你想利用线程绘制的话,你可以创建个 ...

  3. 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件

    GitHub源码仓库:Qt学习例程 1. QPainter绘图抗锯齿 /// 抗锯齿测试 /// painter.drawEllipse(QPoint(100,50), 50, 50);// 设置 抗 ...

  4. 【Qt教程】3.4 - Qt5 QPainter绘图事件、绘图功能

    1. QPainter绘图事件 简介 Qt的绘图系统允许使用现同的API在屏幕和其他打印设备上进行绘制.整个绘图系统基于 QPainter.QPaintDevice.QPaintEngine 三个类. ...

  5. Qt:46---QPainter绘图之QPen、QBrush、QFont工具

    这3个工具都是用来辅助QPainter绘图的 一.QPen 功能:用于绘图时对线条进行设置,主要包括线宽.颜色.线型等 常用函数 通常一个设置函数都有一个对应的读取函数,例如setColor()用于设 ...

  6. 【Qt】2D绘图之图形视图框架(一)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...

  7. 【Qt】2D绘图之双缓冲绘图

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制矩形 04. 双缓冲绘图 05. 附录 01. 概述 所谓的双缓冲绘图的概念.双缓冲(double-buffers)绘 ...

  8. 【Qt】2D绘图之涂鸦板

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计(基本功能) 04. 程序设计(放大功能) 05. 程序设计(放大功能) 06. 附录 01. 概述 结合前面所学 ...

  9. 【Qt】2D绘图之窗口-视口转换

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序示例 04. 为什么要修改这个逻辑坐标矩形? 05. 窗口和视口 06. 附录 01. 概述 在使用QPainter进 ...

  10. 【Qt】2D绘图之复合模式

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序示例 04. 附录 01. 概述 QPainter提供了复合模式(Composition Modes)来定义如何完成数 ...

最新文章

  1. 【组合数学】指数型母函数 应用 ( 多重集排列问题 | 不同球放在不同盒子里 | 奇/偶数序列的指数生成函数推导 )
  2. 【Java】集合+I/O流+多线程の练习题+面试题
  3. 前端笔试之手写代码(一)
  4. STM32工作笔记0069---汉字显示实验
  5. 剑桥女博士创立情绪识别 AI 公司,帮助自闭症患者理解他人表情
  6. Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
  7. 【读书笔记】Java基础学习之目录
  8. 110个oracle常用函数总结(7),oracle110个最常用函数
  9. 计算机odbc数据源管理位置,ODBC 常见数据源配置整理
  10. 即时通讯 音视频 开发技术
  11. word利用宏批量调整图片大小
  12. 物联网4G工业路由器在森林烟火监测的应用
  13. cad2016中选择全图字体怎么操作_cad教程分享CAD如何替换找不到的原文字体?
  14. IoT Analytics:物联网2020年回顾,十大重要进展
  15. 企业为什么做不好生产计划?
  16. 拼音反查(转自大富翁)
  17. 【NOJ1149】【算法实验四】旅游预算
  18. 计算机三级数据库技术知识点
  19. C语言程序设计--体测成绩信息管理系统
  20. SHIF算法原理分析

热门文章

  1. linux更新字体库失败,wps for linux 字体库缺失问题的解决办法
  2. ArcGIS数据生产与精细化制图之中国年降水量分布图的制作
  3. 不清楚Word如何批量转PDF?快来跟我学这两个妙招
  4. PowerMILL宏自动化编程视频教程
  5. 小米10获取root权限_安卓刷机搞机小能手必备的三款root神器 最后一款你肯定用过...
  6. Jlink20P接口定义
  7. FreeSWITCH之默认端口
  8. 图灵 计算机 ppt,人工智能导论(ppt 155页)
  9. SVN版本管理的回滚(SmartSVN)
  10. 基于深度学习的视频质量分析 深度学习视频质量诊断 图像质量诊断