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();
}

会出现这么一个状态,可见之前设置的画笔参数都被销毁了。




今天就学习到这里,明天继续!



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