重写 QWidget 中的 paintEvent() 处理绘图事件
Qt
的绘图系统允许使用相同的API
在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter
,QPainterDevice
和QPaintEngine
三个类。
QPainter
用来执行绘制的操作;
QPaintDevice
是一个二维空间的抽象,这个二维空间允许QPainter
在其上面进行绘制,也就是QPainter
工作的空间;
QPaintEngine
提供了画笔(QPainter
)在不同的设备上进行绘制的统一的接口。QPaintEngine
类应用于QPainter
和QPaintDevice
之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine
这个类的。
我们可以把QPainter
理解成画笔;把QPaintDevice
理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine
类,这个类让不同的纸张、屏幕都能使用一种画笔。
Qt
的绘图系统实际上是,使用QPainter
在QPainterDevice
上进行绘制,它们之间使用QPaintEngine
进行通讯(也就是翻译QPainter
的指令)。
QWidget
中的paintEvent
事件处理器可以在子类中被重写来接收绘图事件,然后在指定区域完成图形的绘制。
首先在头文件的Widget
子类中进行声明
// 绘图事件
void paintEvent(QPaintEvent *event);
到对应的源文件进行定义
void Widget::paintEvent(QPaintEvent *event)
{
// 实例化画家对象,this指定的是绘图设备
QPainter painter(this);
// 设置画笔
QPen pen(QColor(255,0,0));
// 设置画笔宽度
pen.setWidth(3);
// 设置画笔风格
pen.setStyle(Qt::DotLine);
// 使用画笔
painter.setPen(pen);
// 设置画刷
QBrush brush(QColor(0, 255, 0)