Qt 简单绘图

整个绘图系统基于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函数

}

发布了241 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104990946