qt绘图 QPainter类

来源:互联网 发布:像素人物制作软件 编辑:程序博客网 时间:2024/05/22 12:39

简述

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");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

首先为该部件创建了一个 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));}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

首先我们通过 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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

首先我们使用 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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

画弧线时,角度被分成了十六分之一,就是说,如果要 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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这里我们绘制了一个椭圆和一个圆形,都是调用 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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

首先,我们定义一个个坐标点的位置,这里有四个点,分别为: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"));}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

原创粉丝点击