Qt开发之路23---绘图 QPainter
·
一:绘图系统
- Qt 的绘图系统使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
- QPainter用来执行绘制的操作;
- QPaintDevice是一个二维空间的抽象,允许QPainter在其上面进行绘制,也就是QPainter工作的空间;
- QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和QPaintDevice之间。我们可以把QPainter理解成画笔;把QPaintDevice理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine类,这个类让不同的纸张、屏幕都能使用一种画笔。
- Qt 的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯。
二: QPainter
main.cpp
#include <QApplication>
#include "mywidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
signals:
public slots:
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include <QPainter>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
}
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(20,20,220,220);
painter.setPen(Qt::blue);
painter.drawRect(20,20,200,200);
painter.setPen(QPen(Qt::red,5));
painter.setBrush(Qt::green);
painter.drawEllipse(20,250,300,100);
}

- 重写了QWidget的paintEvent()函数。
- 在栈上创建了一个QPainter对象,也就是说,每次运行paintEvent()函数的时候,都会重建这个QPainter对象。如果我们希望保存画笔状态,就必须自己保存数据,否则的话则需要将QPainter作为类的成员变量。
- QPainter接收一个QPaintDevice指针作为参数。QPaintDevice有很多子类,比如QImage,以及QWidget。注意回忆一下,QPaintDevice可以理解成要在哪里去绘制,而现在我们希望画在这个widget,因此传入的是 this 指针。
- QPainter有很多以 draw 开头的函数,用于各种图形的绘制,比如这里的drawLine(),drawRect()以及drawEllipse()等。当绘制轮廓线时,使用QPainter的pen()属性。比如,我们调用了painter.setPen(Qt::blue)将 pen 设置为蓝色,则下面绘制的矩形具有蓝色的轮廓线。接下来,我们将 pen 修改为红色,5 像素宽(painter.setPen(QPen(Qt::red, 5))),又设置了画刷为绿色。这时候再调用 draw 函数,则是具有红色 5 像素宽轮廓线、绿色填充的椭圆。
上一篇:Qt开发之路22—文本文件读写 QTextStream
下一篇:Qt开发之路24—绘图设备(QPixmap、QBitmap、QImage、QPicture)
更多推荐



所有评论(0)