整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。
下图给出了这三个类之间的层次结构:
上面的示意图告诉我们,Qt的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。
例:在MyWidget窗口上绘图
注意:在窗口上绘图时,需要重写绘图事件(即重写QWidget的paintEvent()虚函数),绘图必须放在绘图事件里实现!
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
protected:
//重写绘图事件
//如果在窗口绘图,必须放在绘图事件里实现
//绘图事件内部自动调用,窗口需要重绘的时候(窗口状态改变的时候)
void paintEvent(QPaintEvent *event);
private slots:
void on_pushButton_clicked();
private:
Ui::MyWidget *ui;
int x;
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QPainter>
#include<QPen>
#include<QBrush>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
x=0;//初始化
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);//创建画家对象,并指定当前窗口为绘图设备!!
//p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/image/bk.jpg"));
p.drawPixmap(rect(),QPixmap(":/new/prefix1/image/bk.jpg"));
//定义画笔
QPen pen;
pen.setWidth(5);//设置线宽
//pen.setColor(Qt::red);//设置颜色
pen.setColor(QColor(14,9,234));//RGB设置颜色
pen.setStyle(Qt::DashLine);//设置风格
//把笔交给画家
p.setPen(pen);
//创建画刷对象
QBrush brush;
brush.setColor(Qt::red);
brush.setStyle(Qt::Dense1Pattern);
//把画刷交给画家
p.setBrush(brush);
// 画直线
p.drawLine(250,50,450,50);
//画矩形
p.drawRect(0,0,100,100);
//画圆
brush.setColor(Qt::green);
p.setBrush(brush);
p.drawEllipse(QPoint(200,200),50,50);
//画笑脸
p.drawPixmap(x,180,80,80,QPixmap(":/new/prefix1/image/face.png"));
}
void MyWidget::on_pushButton_clicked()
{
this->x+=20;
if(this->x>this->width())
{
this->x=0;
}
//刷新窗口:让窗口重绘,整个窗口都刷新
update();//间接调用paintEvent函数
}