Qt的圖形繪製簡單學習

本文章參考豆子的博客,並在基礎上做修改(Devbean),原網址:點擊打開鏈接

今天來學習一下Qt的可視化編程:

我們首先新建一個類,將其命名爲paintwidget

放入以下代碼:

//paintwidget.h

#ifndef PAINTWIDGET_H
#define PAINTWIDGET_H

#include <QMainWindow>
#include <QObject>
#include <QWidget>
#include <QPen>
#include <QPainter>
class PaintWidget : public QWidget
{
    Q_OBJECT
public:
    explicit PaintWidget(QWidget *parent = 0);

signals:
protected:
    void paintEvent(QPaintEvent *event);
public slots:
};

#endif // PAINTWIDGET_H
//paintwidget.cpp

#include "paintwidget.h"

PaintWidget::PaintWidget(QWidget *parent) :
    QWidget(parent)
{
    resize(800, 600);
    setWindowTitle(tr("Paint Demo"));
}

void PaintWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::green, 5));
    painter.setBrush(Qt::blue);
    painter.drawEllipse(0, 0, this->width(), this->height());
}

//main.cpp

#include "mainwindow.h"
#include <QApplication>
#include "paintwidget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
   // MainWindow w;
   // w.show();
    PaintWidget *w=new PaintWidget();
    w->show();
    return a.exec();
}

運行以後,會出現下圖樣子的圈,拖動窗口,圈會跟隨窗口變化。



下面我們看一下其中的道理:

Qt的繪圖基於3個類:QPainter;QPaintEngine和QPaintDevice。QPainter是畫筆,QPaintDevice是屏幕,而QPaintEngine就是能使得畫筆在各種屏幕上畫圖的接口。

他們的層次結構如下:



好,既然QPainter是個類,不必每次都重新創建,那我們可以在QPaintWidget的類申明中加入QPainter對象。同時修改.cpp代碼:

//paintwidget.cpp

#include "paintwidget.h"

PaintWidget::PaintWidget(QWidget *parent) :
    QWidget(parent)
{
    painter:QPainter(this);
    resize(800, 600);
    setWindowTitle(tr("Paint Demo"));
}

void PaintWidget::paintEvent(QPaintEvent *)
{
    painter.begin(this);
    painter.setPen(Qt::red);
    painter.drawEllipse(0, 0, this->width(), this->height());
    painter.end();
}

發現是一樣的效果。

在這裏多出了一個begin和end函數,這兩個函數表示開始和結束對一個對象的繪製。如果我們嘗試將begin放在PaintWidget的構造函數裏,調試會輸出警告:

QPainter::begin: Paint device returned engine == 0, type: 1

QPainter::end: Painter not active, aborted

同時無法繪製。

這是因爲,在PaintWidget構造的時候,還沒有構造好PaintEngine,所以這個begin是無效的。

其實上述的用法是不建議的,因爲在Painter.end()函數中,這個Painter的資源還是被銷燬了,例如下述代碼:

void PaintWidget::paintEvent(QPaintEvent *)
{
    painter.begin(this);
    painter.setPen(QPen(Qt::blue,3));
    painter.setBrush(Qt::green);
    painter.drawEllipse(0, 0, this->width(), this->height());
    painter.end();
    painter.begin(this);
    painter.drawEllipse(30, 30, this->width()-50, this->height()-50);
    painter.end();
}

會出現這麼一個狀態,可見之前設置的畫筆參數都被銷燬了。




今天就學習到這裏,明天繼續!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章