简述

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

  • QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDevice、QWidget 和QPaintDevice 显示图形(线、形状、渐变等)、文本和图像。
  • QPaintDevice 不直接绘制物理显示画面,而利用逻辑界面的中间媒介。例如,绘制矩形图形时,为了将对象绘制到 QWidget、QGLPixelBuffer、QImage、QPixmap、QPicture 等多种界面中间,必须使用 QPaintDevice。
  • QPaintEngine 提供了一些接口,可用于 QPainter 在不同的设备上进行绘制。

绘图系统由 QPainter 完成具体的绘制操作,QPainter 类提供了大量高度优化的函数来完成 GUI 编程所需要的大部分绘制工作。它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,例如:点、线、矩形、弧形、饼状图、多边形、贝塞尔弧线等。此外,QPainter 也支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等,QPainter 也支持线性变换,例如平移、旋转、缩放。

QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作。QPainter 也可以与 QPrinter 一起使用来打印文件和创建 PDF 文档。这意味着通常可以用相同的代码在屏幕上显示数据,也可以生成打印形式的报告。

QPainter 一般在部件的绘图事件 paintEvent() 中进行绘制,首先创建 QPainter 对象,然后进行图形的绘制,最后记得销毁 QPainter 对象。当窗口程序需要升级或者重新绘制时,调用此成员函数。使用 repaint()和 update() 后,调用函数 paintEvent()。

  • 简述
  • 绘制文本
  • 绘制直线
  • 绘制矩形
  • 绘制弧线
  • 绘制椭圆
  • 绘制多边形
  • 绘制图片

绘制文本

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 设置画笔颜色painter.setPen(QColor(0, 160, 230));// 设置字体:微软雅黑、点大小50、斜体QFont font;font.setFamily("Microsoft YaHei");font.setPointSize(50);font.setItalic(true);painter.setFont(font);// 绘制文本painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

首先为该部件创建了一个 QPainter 对象,用于后面的绘制。使用 setPen() 来设置画笔的颜色(淡蓝色)。通过使用 QFont 来构建我们想要的字体,setFamily()设置字体为微软雅黑、setPointSize() 设置点大小30、setItalic() 设置斜体, 然后通过 setFont() 来设置字体,最后调用 drawText() 来实现文本的绘制,这里的 rect() 是指当前窗体的显示区域,Qt::AlignCenter 指文本居中绘制。

绘制直线

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色painter.setPen(QColor(0, 160, 230));// 绘制直线painter.drawLine(QPointF(0, height()), QPointF(width() / 2, height() / 2));
}

首先我们通过 setRenderHint() 来设置反走样,要么绘制出来的线条会出现锯齿,调用 setPen() 来设置画笔颜色(淡蓝色)。最后调用 drawLine() 来实现直线的绘制,其中 QPointF(0, height()) 是指直线的起点坐标、QPointF(width() / 2, height() / 2) 是指直线的终点坐标。

绘制矩形

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色、宽度painter.setPen(QPen(QColor(0, 160, 230), 2));// 设置画刷颜色painter.setBrush(QColor(255, 160, 90));painter.drawRect(50, 50, 160, 100);
}

首先我们使用 setPen() 来设置画笔颜色(淡蓝色)、宽度(2 像素),用来设置矩形区域的边框。然后使用setBrush() 来设置画刷颜色(橙色),用来填充矩形区域,最后调用 drawRect() 来实现矩形的绘制,其中参数依次顺序为 x、y、w、h,是指区域从 x 为 50,y 为 50 的坐标点起,宽度为 160,高度为 100 的矩形。

绘制弧线

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);// 矩形QRectF rect(90.0, 90.0, 80.0, 90.0);// 起始角度int startAngle = 30 * 16;// 跨越度数int spanAngle = 120 * 16;QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色、宽度painter.setPen(QPen(QColor(0, 160, 230), 2));// 绘制弧线painter.drawArc(rect, startAngle, spanAngle);
}

画弧线时,角度被分成了十六分之一,就是说,如果要 30 度,就需是 30*16。它有起始角度和跨度,还有位置矩形,所以,要想画出自己想要的弧线,就需要大概估算出各个参数的预估值。

绘制椭圆

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色、宽度painter.setPen(QPen(QColor(0, 160, 230), 2));// 绘制椭圆painter.drawEllipse(QPointF(120, 60), 50, 20);// 设置画刷颜色painter.setBrush(QColor(255, 160, 90));// 绘制圆painter.drawEllipse(QPointF(120, 140), 40, 40);
}

这里我们绘制了一个椭圆和一个圆形,都是调用 drawEllipse() 接口,我们可以很轻易的发现,如果为椭圆的时候,后面两个参数不一样,圆形则相同。首先我们来看第一个参数 QPointF 是指椭圆的中心点相对当前窗体 QPoint(0, 0) 点的位置,后面的参数指椭圆的 x 轴及 y 轴的半径。

绘制多边形

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色painter.setPen(QColor(0, 160, 230));// 各个点的坐标static const QPointF points[4] = {QPointF(30, 40), QPointF(60, 150), QPointF(150, 160), QPointF(220, 100)};// 绘制多边形painter.drawPolygon(points, 4);
}

首先,我们定义一个个坐标点的位置,这里有四个点,分别为:QPointF(30, 40)、QPointF(60, 150)、QPointF(150, 160)、 QPointF(220, 100),然后调用 drawPolygon() 将各个点连接起来,绘制为多边形。

绘制图片

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 绘制图标painter.drawPixmap(rect(), QPixmap(":/Images/logo"));
}

通过 drawPixmap() 来绘制图片,我们可以指定图片绘制的区域 QRect,这里为整个界面的区域,当界面伸缩的时候,图片也会跟着伸缩。

本文转载自:http://blog.csdn.net/liang19890820/article/details/51154216

Qt之图形(QPainter的基本绘图)相关推荐

  1. QT界面简单的图形移动和鼠标绘图

    QT界面图形移动及鼠标绘图 0.首先头文件: #include <QPainter> #include <QMouseEvent> #include <QKeyEvent ...

  2. Qt 之图形(QPainter 的基本绘图)

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

  3. [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)

    [Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主  发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社 ...

  4. [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

    [Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...

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

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

  6. 【QT】QT从零入门教程(十三):QT画笔工具QPainter (双缓冲绘图)

      QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage.QOpenGLPaintDevice.QWidget 和QPaintDevice 显示图形(线.形状.渐变等). ...

  7. [Qt教程] 第18篇 2D绘图(八)双缓冲绘图

    [Qt教程] 第18篇 2D绘图(八)双缓冲绘图 楼主  发表于 2013-5-2 22:07:23 | 查看: 789| 回复: 1 双缓冲绘图 版权声明 该文章原创于Qter开源社区(www.qt ...

  8. [Qt教程] 第17篇 2D绘图(七)涂鸦板

    [Qt教程] 第17篇 2D绘图(七)涂鸦板 楼主  发表于 2013-5-2 21:37:41 | 查看: 1255| 回复: 16 涂鸦板 版权声明 该文章原创于Qter开源社区(www.qter ...

  9. [Qt教程] 第16篇 2D绘图(六)坐标系统

    [Qt教程] 第16篇 2D绘图(六)坐标系统 楼主  发表于 2013-5-2 20:08:12 | 查看: 738| 回复: 0 坐标系统 版权声明 该文章原创于Qter开源社区(www.qter ...

最新文章

  1. Kotlin实战指南九:延迟初始化
  2. VTK:Utilities之DenseArrayRange
  3. 跳过人脸检测和关键点定位,Facebook等提出实时3D人脸姿态估计新方法
  4. Onedark风格配色方案
  5. Listener 快速开始
  6. PMP项目管理认证体系
  7. mysql数据库初始化不成功_初始化mysql的数据库失败怎么办
  8. QT24A01 TNK以太网变压器
  9. 软件耦合的分类及解决方法
  10. uefi装完系统后无法引导_uefi装win7启动不了怎么解决?
  11. 带电插拔损坏设备原理_那些设备可以热插拔?
  12. ansible-playbook changed_when使用
  13. 【c语言】有符号机器数之间怎么比较大小?
  14. div从上到下从左到右自动换行显示排列
  15. Socket 【网络通信 - Socket】
  16. uniapp引入vant
  17. windows下node版本管理
  18. 爬虫进行isca-speech分会场的pdf批量下载部分问题解决
  19. 如何避免毕业论文选题和别人雷同?
  20. 【Java从入门到天黑|05】JavaSE入门之面向对象(上)

热门文章

  1. 只需百行代码,Python带你玩转汉服圈
  2. Java最全的设计模式之结构型模式
  3. 计算机中agp显卡的原理,AGP显卡
  4. 王者荣耀s18赛季服务器什么时候维护好,王者荣耀S18赛季结束时间 王者荣耀S18赛季什么时候结束...
  5. 测试恋爱值的软件,全国恋爱等级测试
  6. 高考英语听力软件测试,明天就要高考了,80后90后们,外语听说测试你们知道哇?...
  7. 初识C语言之——static修饰变量及函数的认知。
  8. 关于我对Mars-3D的学习心得
  9. 服务式办公室,围绕办公生态
  10. VMware vCenter Server 8.0安装并添加ESXi 7.0主机(含ESXi 6.7版本升级至7.0版本)