本文章參考豆子的博客,並在基礎上做修改(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();
}
會出現這麼一個狀態,可見之前設置的畫筆參數都被銷燬了。
今天就學習到這裏,明天繼續!