简述

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. 托管数据中心vs.云计算:保障关键任务数据安全
  2. 知识梳理——CSS篇
  3. SQl---基础整理5
  4. 年发5篇Science,现入选中国榜“35岁以下科技创新35人”!
  5. 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
  6. 虚拟机ping不通主机与外网的解决方法
  7. groupby多个字段性能_SQL 性能优化
  8. stm32 某个io引脚不能拉高_【stm32f407】IO引脚复用和映射
  9. animate支持的css属性
  10. 安装完jdk在cmd输入Java没有反应的解决办法
  11. xx闪购-商品列表布局设计
  12. EXCEL 导入MSSqlserver数据库报错
  13. 获取计算机特征码,如何查看计算机特征码
  14. 手机背景图片被删除怎么恢复
  15. QUIC传输协议设计
  16. STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)
  17. 京东数科java一面【过】
  18. 心路历程:爬虫实战——从数据到产品
  19. 从来不作死只玩命的10年黑客
  20. did模型(did模型适用范围)

热门文章

  1. 零窗口探测怎么抓包_窗口信息探测(Spy4Win) v0.20b 中文版
  2. js 宏观任务和微观任务 promise的代码为什么比setTimeout先执行
  3. OpenCascade BRep Format Description
  4. oracle无效列类型1111以及文字与格式字符串不匹配问题
  5. Android Studio在类微信程序完成“蓝牙聊天功能”实现蓝牙通信
  6. 【function.apply】apply的使用
  7. 常用数据结构:线性结构
  8. oracle排序不生效问题
  9. 盘点科技巨头入场隐私计算
  10. 【python】欧姆龙智能物料排布之二维装箱算法实现