Qt的绘图功能主要依赖于QPainter
,该类提供了一系列用于绘制图形的方法,作为一个跨平台框架,QPainter的底层实现会根据操作系统不同而有所差异。这篇笔记我们介绍Qt的绘图机制。
QWidget中,虚函数paintEvent(QPaintEvent *)
用于图形绘制。我们可以自己重写这个成员函数,绘制我们自己想要的图形。绘制图形时,主要使用QPainter和QPen这两个工具类,前者相当于具体绘画时的画手,后者定义画笔。
下面例子中,我们自定义了一个DrawWidget
,它初始化时使用白色填充整个区域,然后在paintEvent
函数中绘制了一个矩形(Rect)。
drawwidget.h
#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#define cout qDebug()
class DrawWidget : public QWidget
{
Q_OBJECT
public:
explicit DrawWidget(QWidget *parent = nullptr);
signals:
protected:
void paintEvent(QPaintEvent *event) override;
};
#endif // DRAWWIDGET_H
drawwidget.cpp
#include "drawwidget.h"
DrawWidget::DrawWidget(QWidget *parent) : QWidget(parent)
{
setPalette(QPalette(Qt::white));
setAutoFillBackground(true);
}
void DrawWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
painter.drawRect(50, 50, 100, 100);
}
这里要注意一下paintEvent()
的调用时机,和游戏引擎中基于帧的绘制不同,GUI框架总体是消息驱动的。paintEvent()
在组件重绘时触发该函数,我们可以手动调用QWidget
的update()
函数,它会在消息循环的下一个UI事件时触发重绘。