QT Qpainter绘图类的用法(新手必看)
Qt Widgets 提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,主要基于 QPainter、QPaintDevice 和 QPaintEngine 这 3 个类:
我们直到在 Qt 的绘图系统中,由 QPainter 完成具体的绘制操作,该类提供了大量高度优化的函数来完成 GUI 编程所需要的大部分绘制工作。
QPainter 可以绘制一切图形,从最简单的一条直线到其他任何复杂的图形,还可以绘制文本和图片。QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作。
QPainter 一般在一个部件的重绘事件的处理函数 paintEvent() 中进行绘制,首先要创建 QPainter 对象,然后进行图形的绘制,最后销毁 QPainter 对象。
QPainter 提供了一些便捷函数来绘制常用的图形,还可以设置线条和边框的画笔以及设置进行填充的画刷。
例如,新建 Qt Widgets 应用,项目名称为 mydrawing,基类选择 QWidget,类名为 Widget。建立完成后,在 widget.h 文件中声明重绘事件处理函数,建议使用 override 关键字:
如果在构建 QPainter 对象时不想指定绘制设备,那么可以使用不带参数的构造函数,然后使用 QPainter::begin(QPaintDevice * device) 在开始绘制时指定绘制设备,等绘制完成后再调用 end() 函数结束绘制。前面的代码等价于:
上面的代码使用 drawLine() 函数绘制了一条线段,这里使用了该函数的一种重载形式 QPainter::drawLine(const QPoint & p1, const QPoint & p2),其中 p1 和 p2 分别是线段的起点和终点。这里的 QPoint(0, 0) 就是窗口的原点,默认是窗口的左上角(不包含标题栏)。现在可以运行程序查看效果。
除了绘制简单的线条,QPainter 还提供了一些绘制其他常用图形的函数,例如绘制圆弧的函数 drawArc()、绘制扇形的函数 drawPie()、绘制点的函数 drawPoint()、绘制文本的函数 drawText()等,可以在 QPainter 的帮助文档中查看。
- QPainter 用来执行绘图操作;
- QPaintDevice 提供绘图设备,是一个二维空间的抽象,可以使用 QPainter 在其上进行绘制。QPaintDevice是所有可以进行绘制的对象的基类,它的子类主要有 QWidget、QPixmap、QPicture、QImage、QPagedPaintDevice 和 QOpenGLPaintDevice 等;
- QPaintEngine 提供了一些接口,用于 QPainter 和 QPaintDevice 内部,使得 QPainter 可以在不同的设备上进行绘制,除了创建自定义的绘图设备类型,一般编程中不需要使用该类。
我们直到在 Qt 的绘图系统中,由 QPainter 完成具体的绘制操作,该类提供了大量高度优化的函数来完成 GUI 编程所需要的大部分绘制工作。
QPainter 可以绘制一切图形,从最简单的一条直线到其他任何复杂的图形,还可以绘制文本和图片。QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作。
QPainter 一般在一个部件的重绘事件的处理函数 paintEvent() 中进行绘制,首先要创建 QPainter 对象,然后进行图形的绘制,最后销毁 QPainter 对象。
QPainter 提供了一些便捷函数来绘制常用的图形,还可以设置线条和边框的画笔以及设置进行填充的画刷。
例如,新建 Qt Widgets 应用,项目名称为 mydrawing,基类选择 QWidget,类名为 Widget。建立完成后,在 widget.h 文件中声明重绘事件处理函数,建议使用 override 关键字:
protected: void paintEvent(QPaintEvent *event) override;然后到 widget.cpp 文件中添加头文件 #include <QPainter>。在 widget.cpp 文件中对 paintEvent() 函数进行如下定义:
void Widget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(QPoint(0, 0), QPoint(100, 100)); }这里先创建一个 QPainter 对象,使用了 QPainter::QPainter(QPaintDevice * device) 构造函数,并指定了 this 为绘图设备,即表明在 Widget 部件上进行绘制。使用这个构造函数创建的对象会立即开始在设备上进行绘制,自动调用 begin() 函数,然后在 QPainter 的析构函数中调用 end() 函数结束绘制。
如果在构建 QPainter 对象时不想指定绘制设备,那么可以使用不带参数的构造函数,然后使用 QPainter::begin(QPaintDevice * device) 在开始绘制时指定绘制设备,等绘制完成后再调用 end() 函数结束绘制。前面的代码等价于:
QPainter painter; painter.begin(this); painter.drawLine(QPoint(0, 0), QPoint(100, 100)); painter.end();这两种方式都可以完成绘制,无论使用哪种方式,都要指定绘图设备,否则无法进行绘制。
上面的代码使用 drawLine() 函数绘制了一条线段,这里使用了该函数的一种重载形式 QPainter::drawLine(const QPoint & p1, const QPoint & p2),其中 p1 和 p2 分别是线段的起点和终点。这里的 QPoint(0, 0) 就是窗口的原点,默认是窗口的左上角(不包含标题栏)。现在可以运行程序查看效果。
除了绘制简单的线条,QPainter 还提供了一些绘制其他常用图形的函数,例如绘制圆弧的函数 drawArc()、绘制扇形的函数 drawPie()、绘制点的函数 drawPoint()、绘制文本的函数 drawText()等,可以在 QPainter 的帮助文档中查看。