文章目录

  • QPainter绘图
  • 绘图设备
    • QPixmap
    • QImage
    • QPicture

Qt实现2D绘图主要基于QPainter、QPaintDevice、QPaintEngine三个类,- —

  • QPainter用来执行绘图操作。
  • QPaintDevice提供绘图设备,是一个二维空间的抽线,可以用QPainter在绘图设备上进行绘制,是所有可以进行绘制的对象的基类,子类主要有:QWidget、QPixmap、QPicture、QImage、QPrinter和QOpenGLPaintDevice等。
  • QPaintEngine提供一些接口用于QPainter和QPaintDevice内部,使QPainter可以在不同的设备上进行绘制,除了创建自定义的绘图设备类型外,一般不需要使用到QPaintEngine。

QPainter绘图

绘图由QPainter完成具体的操作,可以绘制一切想要的图形,比如线条、矩形、圆乃至更复杂的图形,还可以绘制文本和图片。
绘图操作一般是在一个部件中的重绘事件的处理函数paintEvent()中进行绘制。
paintEvent()函数中首先要创建QPainter对象,然后使用该对象进行图形的绘制,最后销毁QPainter对象。

具体实现操作如下:

  1. 重写绘图事件paintEvent()

  2. 在绘图事件中声明画家对象QPainter painter(this);,this表示在当前部件上绘图,如果不指定this,可以使用QPainter::begin(this)和QPainter::end()两个函数,绘制函数在两个函数中间调用,也表示在当前部件上绘制;

  3. 使用QPainter::draw*函数可以绘制线条、矩形、圆、文字等;

  4. 使用QPainter::setPen()可以设置画笔;

  5. 使用QPainter::setBrush()可以设置画刷;还可以使用QGradient类和QBrush类一起实现渐变填充,Qt支持的渐变填充有:

    1. 线性渐变QLinearGradient
    2. 辐射渐变QRadialGradient
    3. 锥形渐变ConicalGradient

    线性渐变参考代码:

    void Widget::paintEvent(QPaintEvent *event)
    {QPainter painter(this);  // 在当前widget窗口中绘画,指定绘图设备// 设置渐变填充QLinearGradient linearGradient(QPointF(40,190),QPointF(70,190));// 设置渐变填充的颜色linearGradient.setColorAt(0,Qt::red);linearGradient.setColorAt(0.5,Qt::cyan);linearGradient.setColorAt(1,Qt::green);// 指定渐变区域以外的区域的扩散方式linearGradient.setSpread(QGradient::RepeatSpread);// 设置画刷为渐变类型painter.setBrush(linearGradient);painter.drawRect(QRect(QPoint(20,20),QPoint(200,200)));
    }
    

绘制基本图形示例代码:

void Widget::paintEvent(QPaintEvent *event)
{// 实例化画家类QPainter painter(this);  // 在当前widget窗口中绘画,指定绘图设备QPen pen(QColor(45,150,56));pen.setWidth(3);  // 设置画笔宽度pen.setStyle(Qt::DotLine);painter.setPen(pen);  // 设置画笔颜色// 画刷设置填充色,封闭图形会填充QBrush brush(Qt::darkGray);brush.setStyle(Qt::Dense7Pattern);painter.setBrush(brush);painter.drawLine(0,0,100,100);  // 划线painter.drawEllipse(QPoint(100,100),50,50);painter.drawRect(QRect(QPoint(20,20),QPoint(200,200)));}

QPainter高级绘图方法:

  1. QPainter::setRenderHint()可以设置绘制的图形是抗锯齿能力;

  2. QPainter::translate()移动QPainter对象;

  3. QPainter::save()保存QPainter对象的状态;

  4. QPainter::restore()还原QPainter对象的状态

  5. 发生重绘的条件:

    1. 手动调用绘图事件可以使用**update()**或repaint()进行重绘,repaint()会立即进行重绘操作,参考代码:

      // 点击移动按钮,移动图片connect(ui->pushButton,&QPushButton::clicked,this,[=](){// 手动调用重绘图形事件,调用update()更新update();});
      
    2. 被隐藏的部件被重新调用;

    3. 其它一些原因;

QPainter提供了复合模式来完成数字图像的混合,即如何将源图像的像素和目标图像的像素进行合并,通过调用QPainter::setCompositionMode()实现,通过传递的函数参数确定不同的混合类型。

绘图设备

绘图设备是指继承QPainterDevice的子类。Qt提供了这样的类,分别是QPixmapQBitmapQImageQPicture

  • QPixmap为图像在屏幕上的显示做了优化;
  • QBitmapQPixmap的子类,色深限定为1,可以使用QPixmap::isBitmap()确定一个QPixmap对象是不是一个QPixmap
  • QImage为图像的像素级访问做了优化;
  • QPicture可以记录和重现QPainter的各条命令;

还可以使用QImageReader类从文件或其它设备中读取图像,该类提供了一个格式无关的接口,该类依赖于图像底层的支持,类中的一些操作可以节省内存和加快图像的读取;使用QImageWrite类存储图像。

QPixmap

    // Pixmap绘图设备,为平台做显示的优化QPixmap pixmap(400,300);// 填充背景色pixmap.fill(Qt::white);QPainter painter(&pixmap);painter.setPen(QPen(Qt::green));  // 设置画笔painter.drawEllipse(QPoint(100,100),50,50);// 保存图片pixmap.save("D:\\pix.png");

QImage

    // QImage绘图设备,可以对像素进行访问QImage image(600,400,QImage::Format::Format_RGB32);image.fill(Qt::white);  // 填充背景色QPainter painter(&image);painter.setPen(QPen(Qt::blue));  // 设置画笔painter.drawEllipse(QPoint(100,100),50,50);

可以在painteEvent()中对像素值进行修改,示例:

void Widget::paintEvent(QPaintEvent *event)
{// 使用QImage对像素进行修改QImage image;image.load(":/images/phone");QPainter painter(this);// 修改像素值for(int i=20;i<100;++i){for(int j=20;j<100;++j){QRgb value = qRgb(0,0,255);image.setPixel(j,i,value);}}painter.drawImage(10,10,image);
}

QPicture

记录和重现绘图指令

    // QPicture绘图设备,可以记录和重设绘图指令QPicture pic;QPainter painter;painter.begin(&pic);  // 开始在pic上绘图painter.setPen(QPen(Qt::red));  // 设置画笔painter.drawEllipse(QPoint(200,200),100,100);painter.end();  // 结束绘图pic.save("D:\\pic");  // 记录了上面的绘图指令,后缀可以随意,甚至没有后缀// 重现绘图指令QPicture pic;pic.load("D:\\pic");QPainter painter(this);painter.drawPicture(0,0,pic);

【Qt】2D基本绘图操作——QPainter执行绘制及绘图设备介绍相关推荐

  1. android编程绘图,Android编程绘图操作之弧形绘制方法示例

    本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...

  2. Qt项目中,用QPainter进行绘制图形时,边角显示不完整问题的梳理

    总第42篇 本文主要梳理总结了我自己在项目开发过程中经常遇到的一个问题,就是用QPainter进行图形绘制时,边角显示不完整的现象.这个问题虽然比较简单,但是很容易忘记,每次绘图时都要调试一下,故总结 ...

  3. 关于QPainter无法绘制问题

    今天使用了QPainter绘制背景以及窗体上的控件 但是所有语法都正确,资源路径也对,程序也没有报错,也是写在paintevent里的,但是就是不见影,这是怎么回事呢 看下原来的代码 QPainter ...

  4. matlab 实验6 高层绘图操作,实验06_高层绘图操作(第5章).doc

    实验06 高层绘图操作 (第5章 MATLAB绘图) 一.实验目的 1. 掌握绘制二维图形的常用函数. 2. 掌握绘制三维图形的常用函数. 3. 掌握绘制图形的辅助操作. 二.实验内容 1. 绘制函数 ...

  5. matlab 实验6 高层绘图操作,实验六 高层绘图操作答案

    实验六 高层绘图操作答案 实验六 高层绘图操作 实验目的: 1. 掌握绘制二维图形的常用函数 2. 掌握绘制三维图形的常用函数 3. 掌握绘制图形的辅助操作 实验内容: 1. 1. 设,在区间取101 ...

  6. [Qt教程] 第11篇 2D绘图(一)绘制简单图形

    [Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主  发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...

  7. 【Qt入门第11篇】 2D绘图(一)绘制简单图形

    导语 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执 ...

  8. [Qt教程] 第15篇 2D绘图(五)绘制图片

    [Qt教程] 第15篇 2D绘图(五)绘制图片 楼主  发表于 2013-5-2 17:59:00 | 查看: 886| 回复: 3 绘制图片 版权声明 该文章原创于Qter开源社区(www.qter ...

  9. [Qt教程] 第14篇 2D绘图(四)绘制路径

    [Qt教程] 第14篇 2D绘图(四)绘制路径 楼主  发表于 2013-4-27 12:40:52 | 查看: 611| 回复: 0 绘制路径 版权声明 该文章原创于Qter开源社区(www.qte ...

最新文章

  1. 【Shell脚本】颜色显示
  2. gitlab10.x迁移_1.x到2.x的迁移:可观察与可观察:RxJava FAQ
  3. 矩阵论-范数理论及其应用
  4. mysql慢sql增加读写分离_MySQL主从同步+读写分离
  5. xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析
  6. php 魔术方法使用说明详细
  7. [转]supervisor 安装、配置、常用命令
  8. docker基础容器中bash: vi: command not found问题解决
  9. Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
  10. Flex 与.net 进行通信可以通过Fluorine(fluorinefx),WebORB For .net,Socket
  11. 全网首发:编译链接错误:对‘vtable for xxxx’未定义的引用
  12. SD五一联赛(加权并查集)
  13. 肺腑之言-写给喜欢单片机的初学者
  14. mysql geometry索引_Geometry——主流数据库空间索引技术
  15. 高中英语单词名词分类
  16. 网站站长统计分析CNZZ
  17. 数据挖掘-贡献度分析
  18. Linux移植Windows摄像头驱动,基于3.14内核usb摄像头驱动的移植
  19. 【HEOI2013】bzoj3168 钙铁锌硒维生素
  20. python导入文件方法大全

热门文章

  1. em表示什么长度单位_html 常见的长度单位”px em pt” 简介说
  2. 秋草独寻人去后——986山野穿越点滴(七)
  3. ipv6dns服务器后面为空,ipv6获取不到网关和dns服务器
  4. Oracle 表空间详解(tablespace)
  5. 通过ssh访问docker容器的办法 亲测可行
  6. UvaLive6441(期望概率dp)
  7. 如何注册一个微信公众号
  8. 能力素质有所欠缺_表达能力至关重要
  9. Mysql COUNT()条件计数
  10. jquery--图片传送带