当前位置 博文首页 > 木木木 的博客:Qt开发之路23---绘图 QPainter

    木木木 的博客:Qt开发之路23---绘图 QPainter

    作者:[db:作者] 时间:2021-08-20 21:39

    一:绘图系统

    • Qt 的绘图系统使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainterQPainterDeviceQPaintEngine三个类。
    • 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)

    cs