在今天学习了如果在Qt中实现基本图形的绘制。
首先先看下具体要实现是界面:
从上面可以看出,可以把上面的绘画窗口抽象出来,成为一个窗口类,继承自QWidget。
然后所有的功能再抽象为一个界面类,同样可以继承自QWidget。
首先来分析下上面的图形窗口类RenderArea, 要绘制不同的图形,肯定就需要定义不同的图形类型,在其中就可以通过枚举来实现定义,
具体如下:
enum Shape{
Line , Points , Polygon , Rect , RoundedRect , Ellipse ,
Arc , Chord , Path , Text,Pie , Pixmap
};
然后肯定要定义一些槽来接收信号,比如图形的改变,画笔画刷等的属性设置等。
public slots:
void setShape(Shape shape);
void setPen(const QPen& pen);
void setBrush(const QBrush& brush);
void setAnntialiased(bool antialiased);
void setTransformed(bool transformed);
然后就是在继承自QWidget类的函数 paintEvent 的重绘函数进行重写,以及窗口大小函数的重写等。
QSize minimumSizeHint()const Q_DECL_OVERRIDE;
QSize sizeHint() const Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent * event)Q_DECL_OVERRIDE ;
完成了这些基本就完成了这个类的封装了,然后只需要在主界面类(Window)类中进行信号和槽的关联以及事件的处理就可以了。
然后就是主界面类(Window),从上面可以看出,不仅包含了一个RenderArea类,同时还包含了一系列的控件,比如Label标签,复选框,组合框等一些列控件,
所以在这个类中就是完成这个控件的定义和布局,以及事件响应的处理等。
具体代码如下:
renderarea.h
#ifndef RENDERAREA_H
#define RENDERAREA_H
#include<QBrush>
#include<QPen>
#include<QPixmap>
#include<QWidget>
class RenderArea : public QWidget
{
Q_OBJECT
public:
explicit RenderArea(QWidget *parent = 0);
~RenderArea();
enum Shape{
Line , Points , Polygon , Rect , RoundedRect , Ellipse ,
Arc , Chord , Path , Text,Pie , Pixmap
};
QSize minimumSizeHint()const Q_DECL_OVERRIDE;
QSize sizeHint() const Q_DECL_OVERRIDE;
signals:
public slots:
void setShape(Shape shape);
void setPen(const QPen& pen);
void setBrush(const QBrush& brush);
void setAnntialiased(bool antialiased);
void setTransformed(bool transformed);
protected:
void paintEvent(QPaintEvent * event)Q_DECL_OVERRIDE ;
private:
Shape shape;
QPen pen;
QBrush brush;
bool antiliased;
bool transformed;
QPixmap pixmap;
};
#endif // RENDERAREA_H
renderarea.cpp
#include "renderarea.h"
#include<QPainter>
RenderArea::RenderArea(QWidget *parent) : QWidget(parent)
{
//构造函数,完成了对变量的初始化,以及图片的加载等
shape