窗口绘图类控件
本节主要介绍如何实现在窗口中绘图。在 PyQt5中,一般可以通过QPainter,QPen和 QBrush这三个类来实现绘图功能。此外,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的,所以QPixmap也可以被视为绘图的一个类。
1、QPainter
QPainter 类在 QWidget(控件)上执行绘图操作,它是一个绘制工具,为大部分图形界面提供了高度优化的函数,使QPainter类可以绘制从简单的直线到复杂的饼图等。
绘制操作在 QWidget.paintEvent()中完成。绘制方法必须放在 QtGui.QPainter 对象的begin()和 end()之间。QPainter类在控件或其他绘图设备上执行较低级别的图形绘制功能,并通过如表1所示的方法进行绘制。

还可以设置画笔风格(PenStyle),这是一个枚举类,可以由QPainter类绘制。画笔风格如表2所示:

实例演示1:绘制文字
演示在一个窗口中绘制文字
运行程序,显示效果如下:

代码分析:
在这个例子中,首先定义可待绘制的文字:
然后,定义了一个绘制事件,所有的绘制操作都发生在此事件内。绘制事件的核心代码如下:
QtGui.QPainter类负责所有低级别的绘制,所有的绘制方法都要放在begin()和end(之间。这个例子放置的是自定义的drawText()方法。
自定义的绘制方法的核心代码如下:
还有这个的基本原理,新手的话看类和方法里面都没有直接调用这个paintEvent,它怎么就能画出来了?
一个基本的理解,就是这个paintEvent已经涉及到pyqt的窗口内部机制了,建议别太重度使用,它的使用机制和刷新机制都不是很容易理解的,也就是一个方法的调用和刷新很可能都不在你的控制下,当然如果理解了机制之后再使用就比较容易控制了。
首先是使用,这个paintEvent不能直接调用,而是需要重写好相关内部的操作后等待窗口的绘制事件。
绘制的自动触发机制如下:
窗口第一次显示时,
窗口大小调整时,
窗口切换或遮挡,
以上操作系统会自动产生一个绘图事件,强制这个paintEvent的运行;
绘制的”手动“触发机制:
这里的手动不是手动操作正在运行的窗口程序,而是在程序中使用update或者repaint进行重绘
repaint()函数会强制产生一个即时的重绘事件;
update()函数只是在Qt下一次处理事件时才调用一次绘制事件
多次调用update(),Qt会把连续多次的绘制事件压缩成一个单一的绘制事件,这样可避免闪烁现象。所以建议在需要重绘的时候尽量使用update,在必须实时显示绘制的时候使用repaint
self.update()
实例演示2:绘制点
在上一节中使用QPainter绘制了一段文字,文字在屏幕上的显示是由一个个点(point)组成的,本节主要讲解使用QPainter绘制点。
运行脚本,显示效果如图所示:

代码分析:
在这个例子中,在窗口的工作区绘制正弦函数图形,周期是[-100,100].
画笔设置为红色,使用预定义的Qt.red颜色。
每次调整窗口大小时,都会生成一个绘图事件。使用size()方法得到窗口的当前大小,在新的窗口中随机分布工作区中的点。
使用drawPoint(方法绘制一个个点。
2、 Qpen
QPen(钢笔)是一个基本的图形对象,用于绘制直线、曲线或者给轮廓画出矩形、椭圆形、多边形及其他形状等。
实例演示3:OPen的使用
运行程序,显示效果如下:

代码分析:
在这个例子中,使用6种不同的线条样式绘制了6条线,其中前5条线使用的是预定义的线条样式。也可以自定义线条样式,最后一条线就是使用自定义的线条样式绘制的。
以下代码创建了一个QPen对象。为了能更清晰地看清各线之间的差异,将颜色设置成黑色,宽度设置为2像素(px)。Qt.SolidLine是预定义的线条样式之一。
以下代码自定义了一种线条样式。使用Qt.CustomDashLine创建线条样式,然后调用setDashPattern()方法使用数字列表定义样式。数字列表的个数必须是偶数,在本例中数字列表是[1, 4,5,4],它的个数是4。在数字列表中,奇数位(数字列表中的第1,3,5等位置)代表一段横线,偶数位(数字列表中的第2,4,6等位置)代表两段横线之间的空余距离。在数字列表中数字越大,横线和空余距离就越大。本例中数字列表[1,4,5,4]代表的意义是:1像素宽度的横线,4像素宽度的空余距离,5像素宽度的横线,4像素宽度的空余距离。
3、QBrush
QBrush(画刷)是一个基本的图形对象,用于填充如矩形、椭圆形或多边形等形状。QBrush有三种类型:预定义、过渡和纹理图案。
实例演示4:QBrush的使用
演示使用QBrush在窗口中填充不同背景的矩形,其完整代码如下:
运行程序,显示效果如下:

代码分析:
在这个例子中,在窗口中绘制出9种不同背景填充的矩形。
以下代码定义了QBrush对象,然后将QPainter对象的画刷设置成QBrush对象,并通过调用drawRect(方法绘制矩形。
4、QPixmap
QPixmap类用于绘图设备的图像显示,它可以作为一个QPaintDevice对象,也可以加载到一个控件中,通常是标签或按钮,用于在标签或按钮上显示图像。
QPixmap可以读取的图像文件类型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。
QPixmap类中的常用方法如表3所示。

样例前面已经介绍很多了,在此不在列举。核心代码为: