本文章参考豆子的博客,并在基础上做修改(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();
}
会出现这么一个状态,可见之前设置的画笔参数都被销毁了。
今天就学习到这里,明天继续!