一、QPaintEvent
绘图事件
1、paintEvent
函数
- 该绘图函数为虚函数,一般要在子类中去重新实现,来接受绘图事件。
- 通过
QPainter
来绘图时,一般必须要在paintEvent
函数中来进行。在该函数中重新实现所有的绘图操作,程序在初始化之后会自动调用该绘图事件函数来进行绘图。
2、绘图函数的调用
- 绘图函数
paintEvent
的首次调用是在所有的UI
都初始化之后进行的。 - 当程序的
UI
发生变化时,如控件大小位置变化、控件由隐藏到显示变化时,程序会调用paintEvent
函数 - 当调用
repaint
或update
函数时,会导致程序调用paintEvent
函数。一般推荐使用update
函数,因为Qt
针对update
做了优化和处理,而repaint
则没有。
二、QPainter
基础
1、简介
QPainter
一般在paintEvent
事件函数中去使用,否则不会生效。在虚函数paintEvent
中去重新实现对应功能,如构建和自定义画家QPainter
对象,并指定绘图设备(即具体在什么上绘制,如指定的label
或widget
等控件),进行绘制对应的UIQPainter
在绘制GUI的程序上,提供了高度的优化功能。它能绘制几乎所有的 UI,如:点、线条、矩形、圆弧、椭圆、弦、图片、文字、填充等。
2、常用接口
QPainter (QPaintDevice *device)
:构建画家对象,并指定绘图设备,即在哪上面进行绘制。drawArc
:在指定的矩形中画内切的圆弧drawChord
:在指定的矩形中画弦drawPie
:在指定矩形中画饼型图drawConvexPolygon
:根据给定的多个点来画凸多边形drawPolygon
:画多边形drawEllipse
:在指定矩形内画椭圆drawImage
:绘制图片,相当于用指定的图片来填充指定的矩形。drawLine
:根据给定的点来画线drawPolyline
:根据多个点来画折线,折线的首尾不相连drawPath (const QPainterPath &path)
:画指定的路径图,可以画各种各样的不规则图形。drawPicture
:在给定的点重新加载展示指定的图片drawPixmap
:画像素图,即用指定的图来在指定矩形中进行填充drawPoint
:画一个点drawRect
:画方正的矩形drawRoundedRect
:画带圆角的矩形drawText
:画文本文字fillRect
:用指定的颜色来填充矩形区域,此时没有边线,只是填充指定区域font
:返回当前用来绘制文本的字体fontMetrics
:在画家处于激活的状态下返回当前字体的几何尺寸信息opacity
:返回当前的画家的透明度,默认值为1layoutDirection
:当绘制文本内容时,返回布局方向setPen
:设置画笔的样式setOpacity
:设置不透明度,取值的范围是 0.0 0.0 0.0 ~ 1.0 1.0 1.0,当值为 0.0 0.0 0.0时为完全透明,当值为 1.0 1.0 1.0时为完全不透明。setBackground
:设置填充背景的颜色样式,当背景模式为透明时,该函数将不起作用setBrush
:以指定的颜色样式填充所画的图形setFont
:绘制文本内容时,来设置对应的字体样式setLayoutDirection
:当绘制文本内容时,用来设置布局的方向
3、对比 QPainter
和 QPen
QPainter
和QPen
都可以调用各自的setBrush函数,但是作用的效果完全不同
(1)、 QPainter
调用setBrush函数
- 此时画家
QPainter
可以以指定的颜色来填充所绘制的整个封闭图形(只有封闭的图形才能被填充,如弦Arc
未封闭将不能被填充),相当于刷子。 - 或者此时画家
QPainter
以指定的样式来填充封闭图形,(以颜色或样式填充只能有一种起作用,不可以同时起作用)。 - 应用示例
void PaintEventTest::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setBrush(QColor(0, 200, 250, 200)); //设置填充颜色
painter.setPen(QPen(Qt::red,20)); //设置画笔的颜色和宽度。若不设置画笔,则画家会以默认宽度和颜色的画笔来绘制边线
painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);
}
(2)、 QPen
调用setBrush函数
- 此时只是用来填充笔画,其效果相当于setColor。即只是设置线条的颜色。
- 应用示例
void PaintEventTest::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen;
pen.setBrush(Qt::red); //只是设置画笔的颜色
//pen.setColor(Qt::blue); //和上面setBrush作用相同都是设置画笔的颜色
pen.setWidth(6);
painter.setPen(pen);
painter.drawPie(QRect(100, 100, 500, 500), 0, 260 * 16);
}
三、基本应用
1、设置画笔样式 setPen
有三种方式
(1)、setPen(const QPen &pen)
:直接设置画笔QPen的样式,该项可以同时设置画笔的众多属性,如:宽度、线条样式、颜色等,因此最为常用。
- 首先创建QPen的对象画笔,然后设置该画笔
- 在此可以通过构造函数或子函数来设置画笔的:样式、颜色(包括透明度)、线宽等属性。
- 然后画家通过 setPen 函数来将该画笔设置到对应的画家对象上。
- Qt::PenStyle默认为实线类型。
- 使用示例如下:
// 1、通过构造函数创建画笔pen01的属性
QPen pen01(Qt::red, 8);
// 2、通过子函数来单独设置pen02的属性
QPen pen02;
pen02.setBrush(QColor(0, 200, 200, 100));
pen02.setWidth(10);
pen02.setStyle(Qt::DotLine);
(2)、setPen(const QColor &color)
:只能设置画笔的颜色
- 该函数只能设置画笔的颜色,包括透明度;不可以设置其它的属性
- QColor(int r, int g, int b, int a = 255)在设置颜色的时候,可以通过构造函数来设置其对应的值,其中透明度值只能是0到255之间,不可以用0.0~1.0之间的值来代替
- 透明度默认值为 255,即不透明。
- 使用示例
// 直接通过画家设置其颜色和透明度,最后一个值255为透明度
painter.setPen(QColor(200,0,0,255));
(3)、setPen(Qt::PenStyle style)
:设置画笔的样式,如实线、虚线、点画线等样式
- 只能设置画笔的样式,默认为实线,应用最少。
2、绘制圆弧类图形,如drawArc
,drawChord
,drawPie
(1)、绘制圆弧时,函数参数具体如下:
- 指定的矩形、起始的角度和圆弧的跨度角。其中圆弧内切于指定的矩形;起始角度和圆弧跨度角必须为一个角度的
1
16
\frac{1}{16}
161 ,如需要绘制的圆弧图形起始角度为
10
°
10°
10°,跨度角为
90
°
90°
90°,就需要指定对应的参数为:起始角度
startAngle = 10*16
,跨度角spanAngle = 90*16
。因为该函数在绘制圆弧时会自动取给定角度参数的 1 16 \frac{1}{16} 161 ,所以要将需要的角度值乘以 16,才能得到预定的结果。 - 起始角度
0
度位于3点钟方向,即 X X X轴正方向的位置,如下图所示: - 角度值为正,则是逆时针;角度值为负,则是顺时针
(2)、示例如下:
void PaintEventTest::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen01(Qt::red, 8);
QPen pen02(QColor(0, 200, 200), 6);
QPen pen03(QColor(0, 0, 255, 200), 7);
painter.setPen(pen01);
painter.drawArc(QRect(10, 10, 500, 500), 0, 260 * 16);
painter.setPen(pen02);
painter.drawChord(QRect(600, 10, 500, 500), 0, 260 * 16);
painter.setPen(pen03);
painter.drawPie(QRect(1160, 10, 500, 500), 0, 260 * 16);
}
从左到右依次为drawArc
,drawChord
,drawPie
3、填充矩形区域 fillRect
(1)、应用分析
- 用指定的颜色来填充矩形区域,且该矩形区域没有边线,此时可以通过画家
QPainter
来调用fillRect函数实现。 - fillRect可以用指定的颜色或样式来对矩形区域进行填充,相当于画刷。
(2)、示例
void PaintEventTest::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// 以指定颜色填充矩形
painter.fillRect(QRect(50, 50, 600, 300), QColor(0, 200, 250, 200));
// 以指定样式填充矩形
painter.fillRect(QRect(700, 50, 600, 300), Qt::DiagCrossPattern);
}