基本图形绘制

QPainter绘制基本图形

image-20220223105154096

注意:QPainter画弧度所使用的角度值,是以1/16°为单位的,在画弧度的时候1°用16表示。

例如:30°——30 x 16

兼容模式QPainer::CompositionMode

**例如:**可用于图片叠加,达到你想要的效果。


QPainterPath绘制简单图形

QPainterPath为QPainter类提供一个存储容器,里面包含了所要绘制的内容的集合及绘制顺序,如长方形、多边形、曲线等各种任意图形。当需要绘制此预先存储在QPainterPath对象中的内容时,只需调用QPainter类的DrawPath()即可,如addRect()加入一个方形,addEllipse加入一个椭圆形,addText()加入文本。


画笔笔刷风格

画笔风格——Qt::PenStyle

image-20220223111111389

笔帽风格——Qt::PenCapStyle

Qt::SquareCap 方形线端,不覆盖线的端点

Qt::FlatCap 方形线端,覆盖线的端点,并以线框一半向外延伸

Qt::RoundCap 圆线端

连接点——Qt::PenJoinStyle

Qt::BevelJoin 两条线相汇形成方形连接

Qt::MiterJoin 两条线相汇形成尖角连接

Qt::RoundJoin两条线相汇形成圆角连接

填充模式——Qt::FillRule

image-20220223111453335

  • Qt::OddEventFill填充规则:从图形中某一点画一条水平线到图形外,若这条线与图形边线的交点为奇数则说明此点位与图形的内部;若交点为偶数则此点在图形的外部。
  • Qt::WindingFill填充规则:从图形中某一点画一条水平线到图形外,每个交点外边线方向可能向上、向下、方向相反的相互抵消,若结果不为0表示此点在图形内,若为0则在图形外。其中边线的方向是由QPainterPath创建时根据描述的顺序决定的,如果采用addRect()或addPolygon()等函数加入的图形默认为顺时针方向。

铺展效果——Qt::Gradient::Type

image-20220223114627884

QGradient::PadSpread :默认风格

QGradient::RepeatSpread:线性渐变

QGradient::ReflectSpread:圆形渐变

画刷风格——Qt::BrushStyle

image-20220223114823381


示例

image-20220223145256695

mainwidget.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include<paintarea.h>
#include<QLabel>
#include<QComboBox>
#include<QSpinBox>
#include<QPushButton>
#include<QGridLayout>
class MainWidget : public QWidget
{
Q_OBJECT

public:
MainWidget(QWidget *parent = 0);
~MainWidget();
void initWidgets();
private slots:
void ShowShape(int value);
void ShowPenColor();
void ShowPenWidth(int value);
void ShowPenStyle(int value);
void ShowPenCap(int value);
void ShowPenJoin(int value);
void ShowFillRule(int value);
void ShowSpreadStyle(int value);
void ShowBrushColor();
void ShowBrush(int value);
private:
PaintArea* m_paintArea; //绘图区域
QLabel* m_shapeLabel ; //形状
QComboBox* m_shapeCombox;
QLabel* m_penWidthLabel;//线宽
QSpinBox *m_penWithSpinBox;
QLabel* m_penColorLabel;//画笔颜色
QFrame* m_penColorFrame;
QPushButton* m_penColorBtn;//确认选择画笔颜色按钮
QLabel* m_penStyleLabel;//画笔风格
QComboBox* m_penStyleComboBox;
QLabel* m_penCapLabel;//笔帽风格
QComboBox* m_penCapComboBox;
QLabel* m_penJoinLabel;//画笔连接点
QComboBox* m_penJoinComboBox;
QLabel* m_fillRuleLabel;//填充模式
QComboBox* m_fillRuleComboBox;
QLabel* m_spreadLabel;//铺展效果
QComboBox* m_spreadComboBox;
QGradient::Spread m_spread;
QLabel* m_brushColorLabel;//画刷颜色
QFrame* m_brushColorFrame;
QPushButton* m_brushColorBtn;
QLabel* m_brushStyleLabel;//画刷风格
QComboBox* m_brushStytleComboBox;
QGridLayout* m_rightLayout;

};

#endif // MAINWIDGET_H

mainwidget.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
#include "mainwidget.h"
#include<QColorDialog>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
initWidgets();
}

MainWidget::~MainWidget()
{

}

//初始化部件
void MainWidget::initWidgets()
{
m_paintArea = new PaintArea;
m_shapeLabel = new QLabel(tr("形状"));
m_shapeCombox = new QComboBox;

m_shapeCombox->addItem(tr("Line"),PaintArea::Line);
m_shapeCombox->addItem(tr("Rectangle"),PaintArea::Rectangle);
m_shapeCombox->addItem(tr("RoundedRect"),PaintArea::Rectangle);
m_shapeCombox->addItem(tr("Ellipse"),PaintArea::Ellipse);
m_shapeCombox->addItem(tr("Polygon"),PaintArea::Polygon);
m_shapeCombox->addItem(tr("Polyline"),PaintArea::Polyline);
m_shapeCombox->addItem(tr("Points"),PaintArea::Points);
m_shapeCombox->addItem(tr("Arc"),PaintArea::Arc);
m_shapeCombox->addItem(tr("Path"),PaintArea::Path);
m_shapeCombox->addItem(tr("Text"),PaintArea::Text);
m_shapeCombox->addItem(tr("Pixmap"),PaintArea::Pixmap);
connect(m_shapeCombox,SIGNAL(activated(int)),this,SLOT(ShowShape(int)));

m_penColorLabel = new QLabel(tr("画笔颜色"));
m_penColorFrame = new QFrame;
m_penColorFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken);//设置风格
m_penColorFrame->setAutoFillBackground(true);
m_penColorFrame->setPalette(QPalette(Qt::black));
m_penColorBtn = new QPushButton(tr("更改"));
connect(m_penColorBtn,SIGNAL(clicked(bool)),this,SLOT(ShowPenColor()));

m_penWidthLabel = new QLabel(tr("画线宽度"));
m_penWithSpinBox = new QSpinBox;
m_penWithSpinBox->setRange(1,20);
connect(m_penWithSpinBox,SIGNAL( valueChanged(int)),SLOT(ShowPenWidth(int)));

m_penStyleLabel = new QLabel(tr("画笔风格"));
m_penStyleComboBox = new QComboBox;
m_penStyleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine ));
m_penStyleComboBox->addItem(tr("DashLine"),static_cast<int>(Qt::DashLine));
m_penStyleComboBox->addItem(tr("DotLine"),static_cast<int>(Qt::DotLine));
m_penStyleComboBox->addItem(tr("DashDotLine"),static_cast<int>(Qt::DashDotLine ));
m_penStyleComboBox->addItem(tr("DashDotDotLine"),static_cast<int>(Qt::DashDotDotLine ));
m_penStyleComboBox->addItem(tr("CustomDashLine"),static_cast<int>(Qt::CustomDashLine));
connect(m_penStyleComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenStyle(int)));

m_penCapLabel = new QLabel(tr("画笔笔帽"));
m_penCapComboBox = new QComboBox;
m_penCapComboBox->addItem(tr("SquareCap"),Qt::SquareCap);
m_penCapComboBox->addItem(tr("FlatCap"),Qt::FlatCap);
m_penCapComboBox->addItem(tr("RoundCap"),Qt::RoundCap);
connect(m_penCapComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenCap(int)));

m_penJoinLabel = new QLabel(tr("画笔连接点"));
m_penJoinComboBox = new QComboBox;
m_penJoinComboBox->addItem(tr("BevelJoin"),Qt::BevelJoin);
m_penJoinComboBox->addItem(tr("MiterJoin"),Qt::MiterJoin);
m_penJoinComboBox->addItem(tr("RoundJoin"),Qt::RoundJoin);
connect(m_penJoinComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenJoin(int)));

m_fillRuleLabel = new QLabel(tr("填充模式"));
m_fillRuleComboBox = new QComboBox;
m_fillRuleComboBox->addItem(tr("Odd Even"),Qt::OddEvenFill);
m_fillRuleComboBox->addItem(tr("Winding"),Qt::WindingFill);
connect(m_fillRuleComboBox,SIGNAL(activated(int)),this,SLOT(ShowFillRule(int)));

m_spreadLabel = new QLabel(tr("铺展效果"));
m_spreadComboBox = new QComboBox;
m_spreadComboBox->addItem(tr("PadStread"),QGradient::PadSpread);
m_spreadComboBox->addItem(tr("RepeatSpread"),QGradient::RepeatSpread);
m_spreadComboBox->addItem(tr("ReflectSpread"),QGradient::ReflectSpread);
connect(m_spreadComboBox,SIGNAL(activated(int)),this,SLOT(ShowSpreadStyle(int)));

m_brushColorLabel = new QLabel(tr("画刷颜色"));
m_brushColorFrame = new QFrame;
m_brushColorFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken);
m_brushColorFrame->setAutoFillBackground(true);
m_brushColorFrame->setPalette(QPalette(Qt::green));
m_brushColorBtn = new QPushButton(tr("更改"));
connect(m_brushColorBtn,SIGNAL(clicked()),this,SLOT(ShowBrushColor()) );

m_brushStyleLabel = new QLabel(tr("画刷风格"));
m_brushStytleComboBox = new QComboBox;
m_brushStytleComboBox->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern));
m_brushStytleComboBox->addItem(tr("Dense1Pattern"),static_cast<int>(Qt::Dense1Pattern));
m_brushStytleComboBox->addItem(tr("Dense2Pattern"),static_cast<int>(Qt::Dense2Pattern));
m_brushStytleComboBox->addItem(tr("Dense3Pattern"),static_cast<int>(Qt::Dense3Pattern));
m_brushStytleComboBox->addItem(tr("Dense4Pattern"),static_cast<int>(Qt::Dense4Pattern));
m_brushStytleComboBox->addItem(tr("Dense5Pattern"),static_cast<int>(Qt::Dense5Pattern));
m_brushStytleComboBox->addItem(tr("Dense6Pattern"),static_cast<int>(Qt::Dense6Pattern));
m_brushStytleComboBox->addItem(tr("Dense7Pattern"),static_cast<int>(Qt::Dense7Pattern));
m_brushStytleComboBox->addItem(tr("HorPattern"),static_cast<int>(Qt::HorPattern));
m_brushStytleComboBox->addItem(tr("VerPattern"),static_cast<int>(Qt::VerPattern));
m_brushStytleComboBox->addItem(tr("CrossPattern"),static_cast<int>(Qt::CrossPattern));
m_brushStytleComboBox->addItem(tr("BDiagPattern"),static_cast<int>(Qt::BDiagPattern));
m_brushStytleComboBox->addItem(tr("FDiagPattern"),static_cast<int>(Qt::FDiagPattern));
m_brushStytleComboBox->addItem(tr("DiagCrossPattern"),static_cast<int>(Qt::DiagCrossPattern));
m_brushStytleComboBox->addItem(tr("LinearGradientPattern"),static_cast<int>(Qt::LinearGradientPattern));
m_brushStytleComboBox->addItem(tr("ConicalGradientPattern"),static_cast<int>(Qt::ConicalGradientPattern));
m_brushStytleComboBox->addItem(tr("RadialGradientPattern"),static_cast<int>(Qt::RadialGradientPattern));
m_brushStytleComboBox->addItem(tr("TexturePattern"),static_cast<int>(Qt::TexturePattern));
connect(m_brushStytleComboBox,SIGNAL(activated(int)),this,SLOT(ShowBrush(int)));

//添加布局
m_rightLayout = new QGridLayout;
m_rightLayout->addWidget(m_shapeLabel,0,0);
m_rightLayout->addWidget(m_shapeCombox,0,1);
m_rightLayout->addWidget(m_penColorLabel,1,0);
m_rightLayout->addWidget(m_penColorFrame,1,1);
m_rightLayout->addWidget(m_penColorBtn,1,2);
m_rightLayout->addWidget(m_penWidthLabel,2,0);
m_rightLayout->addWidget(m_penWithSpinBox,2,1);
m_rightLayout->addWidget(m_penStyleLabel,3,0);
m_rightLayout->addWidget(m_penStyleComboBox,3,1);
m_rightLayout->addWidget(m_penCapLabel,4,0);
m_rightLayout->addWidget(m_penCapComboBox,4,1);
m_rightLayout->addWidget(m_penJoinLabel,5,0);
m_rightLayout->addWidget(m_penJoinComboBox,5,1);
m_rightLayout->addWidget(m_fillRuleLabel,6,0);
m_rightLayout->addWidget(m_fillRuleComboBox,6,1);
m_rightLayout->addWidget(m_spreadLabel,7,0);
m_rightLayout->addWidget(m_spreadComboBox,7,1);
m_rightLayout->addWidget(m_brushColorLabel,8,0);
m_rightLayout->addWidget(m_brushColorFrame,8,1);
m_rightLayout->addWidget(m_brushColorBtn,8,2);
m_rightLayout->addWidget(m_brushStyleLabel,9,0);
m_rightLayout->addWidget(m_brushStytleComboBox,9,1);

QHBoxLayout* mainLayout = new QHBoxLayout(this);
mainLayout->addWidget(m_paintArea);
mainLayout->addLayout(m_rightLayout);
ShowShape(m_shapeCombox->currentIndex());

}

//变更每项设置后,更新图像

void MainWidget::ShowShape(int value)
{
PaintArea::Shape shape =PaintArea::Shape (m_shapeCombox->itemData(value).toInt());//获取用户选择的形状
m_paintArea->setShape(shape);
}

void MainWidget::ShowPenColor()
{
QColor color = QColorDialog::getColor(Qt::black);
m_penColorFrame->setPalette(QPalette(color));
int value = m_penWithSpinBox->value();

int styleIndex = m_penStyleComboBox->currentIndex();
Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt());

int capIndex = m_penCapComboBox->currentIndex();
Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt());

int joinIndex = m_penJoinComboBox->currentIndex();
Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt());

//将当前画笔的各个参数传递-设置
m_paintArea->setPen(QPen(color,value,style,cap,join));
}

void MainWidget::ShowPenWidth(int value)
{
QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值
m_penColorFrame->setPalette(QPalette(color));
int penWidth =value;

int styleIndex = m_penStyleComboBox->currentIndex();
Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt());

int capIndex = m_penCapComboBox->currentIndex();
Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt());

int joinIndex = m_penJoinComboBox->currentIndex();
Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt());

//将当前画笔的各个参数传递-设置
m_paintArea->setPen(QPen(color,penWidth,style,cap,join));
}

void MainWidget::ShowPenStyle(int value)
{
QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值
m_penColorFrame->setPalette(QPalette(color));
int penWidth = m_penWithSpinBox->value();


Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(value).toInt());
if(style == Qt::CustomDashLine)//如果是自定义的
{
QVector<qreal> dashes;
qreal space = 4;
dashes<<1<<space<<2<<space<<3<<space<<4<<space;
m_paintArea->m_pen.setDashPattern(dashes);
m_paintArea->update();
}
else
{
int capIndex = m_penCapComboBox->currentIndex();
Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt());

int joinIndex = m_penJoinComboBox->currentIndex();
Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt());

//将当前画笔的各个参数传递-设置
m_paintArea->setPen(QPen(color,penWidth,style,cap,join));
}
}

void MainWidget::ShowPenCap(int value)
{
QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值
m_penColorFrame->setPalette(QPalette(color));
int penWidth =m_penWithSpinBox->value();

int styleIndex = m_penStyleComboBox->currentIndex();
Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt());

// int capIndex = m_penCapComboBox->currentIndex();
Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(value).toInt());

int joinIndex = m_penJoinComboBox->currentIndex();
Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt());

//将当前画笔的各个参数传递-设置
m_paintArea->setPen(QPen(color,penWidth,style,cap,join));
}

void MainWidget::ShowPenJoin(int value)
{
QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值
m_penColorFrame->setPalette(QPalette(color));
int penWidth =m_penWithSpinBox->value();

int styleIndex = m_penStyleComboBox->currentIndex();
Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt());

int capIndex = m_penCapComboBox->currentIndex();
Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt());

// int joinIndex = m_penJoinComboBox->currentIndex();
Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(value).toInt());

//将当前画笔的各个参数传递-设置
m_paintArea->setPen(QPen(color,penWidth,style,cap,join));
}

void MainWidget::ShowFillRule(int value)
{
Qt::FillRule rule = Qt::FillRule(value);
m_paintArea->setFillRule(rule);
}

void MainWidget::ShowSpreadStyle(int value)
{
m_spread = QGradient::Spread(value);
}

void MainWidget::ShowBrushColor()
{
QColor color = QColorDialog::getColor(Qt::green);
m_brushColorFrame->setPalette(QPalette(color));
ShowBrush(m_brushStytleComboBox->currentIndex());
}

void MainWidget::ShowBrush(int value)
{
QColor color = m_brushColorFrame->palette().color(QPalette::Window);
int brush = m_brushStytleComboBox->itemData(value).toInt();
Qt::BrushStyle style = Qt::BrushStyle(brush);

//线性渐变
if(style == Qt::LinearGradientPattern)
{
//指定线性渐变的区域
QLinearGradient lineGradient(0,0,400,400);
//指定某个位置的渐变色,pos取值范围0~1
lineGradient.setColorAt(0.0,Qt::white);
lineGradient.setColorAt(0.2,color);
lineGradient.setColorAt(1.0,Qt::black);
lineGradient.setSpread(m_spread);

m_paintArea->setBrush(lineGradient);
}
//环形渲染
else if(style == Qt::RadialGradientPattern)
{
//中心坐标,半径长度,焦点坐标,如果需要对称,则中心坐标和焦点坐标保持一致
QRadialGradient radiaGrdient(200,200,150,200,200);
radiaGrdient.setColorAt(0.0,Qt::white);
radiaGrdient.setColorAt(0.2,color);
radiaGrdient.setColorAt(1.0,Qt::black);

m_paintArea->setBrush(radiaGrdient);
}
//弧度渲染
else if(style == Qt::ConicalGradientPattern)
{
//中心坐标,角度
QConicalGradient conicaoGradient(200,200,30);
conicaoGradient.setColorAt(0.0,Qt::white);
conicaoGradient.setColorAt(0.2,color);
conicaoGradient.setColorAt(1.0,Qt::black);

m_paintArea->setBrush(conicaoGradient);
}
else if(style == Qt::TexturePattern)
{
m_paintArea->setBrush(QBrush(QPixmap("test1.jpg")));
}
//其他
else
{
m_paintArea->setBrush(QBrush(color,style));
}
}

paintarea.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef PAINTAREA_H
#define PAINTAREA_H

#include <QWidget>
#include<QPen>
#include<QBrush>

class PaintArea : public QWidget
{
Q_OBJECT
public:
enum Shape{Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap};
explicit PaintArea(QWidget *parent = nullptr);

public:
void setShape(Shape shape);
void setPen(QPen pen);
void setBrush(QBrush brush);
void setFillRule(Qt::FillRule rule);
protected:
void paintEvent(QPaintEvent *event)override;
public:
QPen m_pen;
private:
Shape m_shape;

QBrush m_brush;
Qt::FillRule m_fillrule;


signals:

public slots:
};

#endif // PAINTAREA_H

paintarea.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "paintarea.h"
#include<QPainter>

PaintArea::PaintArea(QWidget *parent) : QWidget(parent)
{
setPalette(QPalette(Qt::white));
setAutoFillBackground(true);//设置背景自动填充
setFixedSize(400,400);


}

void PaintArea::setShape(PaintArea::Shape shape)
{
m_shape = shape;
update();
}

void PaintArea::setPen(QPen pen)
{
m_pen = pen;
update();
}

void PaintArea::setBrush(QBrush brush)
{
m_brush = brush;
update();
}

void PaintArea::setFillRule(Qt::FillRule rule)
{
m_fillrule = rule;
update();
}

void PaintArea::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(m_pen);
painter.setBrush(m_brush);
QRect rect(50,100,300,200);//起始位置,宽高
const QPoint points[4]= {
QPoint(150,100),
QPoint(300,150),
QPoint(100,300),
QPoint(100,300)
};
int startAngle = 30 * 16;//1/16
int spanAngle = 120 * 16;
QPainterPath path;
path.addRect(150,150,100,100);
path.moveTo(100,200);
path.cubicTo(300,100,200,200,300,300);
path.cubicTo(100,300,200,200,100,100);
path.setFillRule(m_fillrule);

switch(m_shape)
{
case Line:
painter.drawLine(rect.topLeft(),rect.bottomRight());
break;
case Rectangle:
painter.drawRect(rect);
break;
case RoundRect:
painter.drawRoundRect(rect);
break;
case Ellipse:
painter.drawEllipse(rect);
break;
case Polygon://多边形,默认为4变形
painter.drawPolygon(points,4);
break;
case Polyline:
painter.drawPolyline(points,4);
break;
case Points:
painter.drawPoints(points,4);
break;
case Arc:
painter.drawArc(rect, startAngle,spanAngle);
break;
case Path:
painter.drawPath(path);
break;
case Text:
painter.drawText(rect,Qt::AlignCenter,tr("Hello world!"));
break;
case Pixmap:
painter.drawPixmap(50,100,QPixmap("test1.jpg"));
break;
default:
break;
}

}