十、窗口绘图类控件
在PyQt5中,一般可以通过QPainter、QPen和QBrush这三个类来实现绘图功能。此外,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的,所以QPixmap也可以被视为绘图的一个类。
1、QPainter
QPainter类在QWidget(控件)上执行绘图操作,绘图操作在QWidget.paintEvent()中完成。绘制方法必须放在QtGui.QPainter对象的begin()和end()之间。QPainter类常用方法:
begin():开始在目标设备上绘制
drawArc():在起始角度和最终角度之间画弧
drawEllipse():在一个矩形内画一个椭圆
drawLine(int x1,int y1,int x2,int y2):绘制一条指定了端点坐标的线。绘制从(x1,y1)到(x2,y2)的直线并设置当前画笔位置为(x2,y2)
drawPixmap():从图像文件中提取Pixmap并将其显示在指定的位置
drawPolygon():使用坐标数组绘制多边形
drawRect(int x,int y,int w,int h):以给定的宽度w和高度h从左上角坐标(x,y)绘制一个矩形
drawText():显示给定坐标处的文字
fillRect():使用QColor参数填充矩形
setBrush():设置画笔风格
setPen():设置用于绘制的笔的颜色、大小和样式
还可以设置画笔风格(PenStyle),这个是一个枚举类,可以由QPainter类绘制,画笔风格如下:
Qt.NoPen:没有线。
Qt.SolidLine:一条简单的线
Qt.DashLine:由一些像素分隔的短线
Qt.DotLine:由一些像素分隔的点
Qt.DashDotLine:轮流交替的点和短线
Qt.DashDotDotLine:一条短线、两个点
Qt.MPenStyle:画笔风格的掩码
例一:绘制文字
# -*- coding: utf-8 -*- | |
""" | |
【简介】 | |
在窗体中绘画出文字的例子 | |
""" | |
import sys | |
from PyQt5.QtWidgets import QApplication ,QWidget | |
from PyQt5.QtGui import QPainter ,QColor ,QFont | |
from PyQt5.QtCore import Qt | |
class Drawing(QWidget): | |
def __init__(self,parent=None): | |
super(Drawing,self).__init__(parent) | |
self.setWindowTitle("在窗体中绘画出文字例子") | |
self.resize(300, 200) | |
self.text = '欢迎学习 PyQt5' | |
def paintEvent(self,event): | |
painter = QPainter(self) | |
painter.begin(self) | |
# 自定义的绘画方法 | |
self.drawText(event, painter) | |
painter.end() | |
def drawText(self, event, qp): | |
# 设置笔的颜色 | |
qp.setPen( QColor(168, 34, 3) ) | |
# 设置字体 | |
qp.setFont( QFont('SimSun', 20)) | |
# 画出文本 | |
qp.drawText(event.rect(), Qt.AlignCenter, self.text) | |
if __name__ == "__main__": | |
app = QApplication(sys.argv) | |
demo = Drawing() | |
demo.show() | |
sys.exit(app.exec_()) |
运行结果:
例二、绘制点
# -*- coding: utf-8 -*- | |
""" | |
【简介】 | |
在窗体中绘画点的例子 | |
""" | |
import sys, math | |
from PyQt5.QtWidgets import * | |
from PyQt5.QtGui import * | |
from PyQt5.QtCore import Qt | |
class Drawing(QWidget): | |
def __init__(self, parent=None): | |
super(Drawing, self).__init__(parent) | |
self.resize(300, 200) | |
self.setWindowTitle("在窗体中画点") | |
def paintEvent(self, event): | |
qp = QPainter() | |
qp.begin(self) | |
# 自定义画点方法 | |
self.drawPoints(qp) | |
qp.end() | |
def drawPoints(self, qp): | |
qp.setPen( Qt.red) | |
size = self.size() | |
for i in range(1000): | |
# [-100, 100]两个周期的正弦函数图像 | |
x = 100 *(-1+2.0*i/1000)+ size.width()/2.0 | |
y = -50 * math.sin((x - size.width()/2.0)*math.pi/50) + size.height()/2.0 | |
qp.drawPoint(x, y) | |
if __name__ == '__main__': | |
app = QApplication(sys.argv) | |
demo = Drawing() | |
demo.show() | |
sys.exit(app.exec_()) |
运行结果:
2、Qpen
QPen是一个基本的图形对象,用于绘制直线、曲线或者给轮廓画出矩形、椭圆形、多边形及其它形状等。
例子:
# -*- coding: utf-8 -*- | |
""" | |
【简介】 | |
绘图中QPen 的例子 ,绘制使用不同样式的6条线 | |
""" | |
import sys | |
from PyQt5.QtWidgets import * | |
from PyQt5.QtGui import * | |
from PyQt5.QtCore import Qt | |
class Drawing(QWidget): | |
def __init__(self): | |
super().__init__() | |
self.initUI() | |
def initUI(self): | |
self.setGeometry(300, 300, 280, 270) | |
self.setWindowTitle('钢笔样式例子') | |
def paintEvent(self, e): | |
qp = QPainter() | |
qp.begin(self) | |
self.drawLines(qp) | |
qp.end() | |
def drawLines(self, qp): | |
pen = QPen(Qt.black, 2, Qt.SolidLine) | |
qp.setPen(pen) | |
qp.drawLine(20, 40, 250, 40) | |
pen.setStyle(Qt.DashLine) |
|
qp.setPen(pen) | |
qp.drawLine(20, 80, 250, 80) | |
pen.setStyle(Qt.DashDotLine) | |
qp.setPen(pen) | |
qp.drawLine(20, 120, 250, 120) | |
pen.setStyle(Qt.DotLine) | |
qp.setPen(pen) | |
qp.drawLine(20, 160, 250, 160) | |
pen.setStyle(Qt.DashDotDotLine) | |
qp.setPen(pen) | |
qp.drawLine(20, 200, 250, 200) | |
pen.setStyle(Qt.CustomDashLine) | |
pen.setDashPattern([1, 4, 5, 4]) | |
qp.setPen(pen) | |
qp.drawLine(20, 240, 250, 240) | |
if __name__ == '__main__< |