我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
优 质 教 程 推 荐:👉👉 Python爬虫从入门到入狱系列 合集👈👈
QPainter_图形绘制控件
- QPainter图形绘制控件
- 补充
- QPen对象
- # QBrush画刷对象
- 示例
QPainter图形绘制控件
-
描述
- 在 PyQt5中,一般可以通过QPainter、QPen、QBrush和QPixmap这四个类来实现绘图功能。其中,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的
- QPainter类在QWidget(控件)上执行绘图操作,它是一个绘制工具,为大部分图形界面提供了高度优化的函数,使QPainter类可以绘制从简单的直线到复杂的饼图等
- 利用QPainter控件进行绘制得到的内容。在窗口尺寸发生改变的时候,会刷新,重新绘制,但是速度极快,以致于肉眼捕捉不到
- QPainter提供了高度优化的功能,可以完成GUI程序所需的大多数绘图。它可以绘制从简单的线条到复杂的形状(如馅饼和和弦)的所有内容。它还可以绘制对齐的文本和像素映射。通常,它会绘制一个"自然"坐标系,但它也可以进行视图和世界变换。QPainter可以对任何继承QPaintDevice类的对象进行操作。
-
继承自:PyQt5.QtGui
-
注意点:绘制操作必须在painterEvent事件方法中完成
-
绘制步骤
a、代码需要写在绘制事件内
paintEvent()
b、绘画开始前先实例化一个画家painter = QPainter(QPaintDevice)
c、在指定容器上开始绘制图形painter.begin(QPaintDevice)
d、给画家设置画笔、笔刷等属性
e、具体绘画
f、结束绘画:painter.end()
from PyQt5.Qt import * import sys class MyWindow(QWidget): def __init__(self): super(MyWindow, self).__init__() self.resize(500, 300) self.setWindowTitle('QPainter图形绘制控件') def paintEvent(self, event): # 实例化一个画家 painter = QPainter() # 画家开始在指定容器上绘制 painter.begin(self) # 给画家设置默认画笔颜色 painter.setPen(QColor(255,0,0)) # 通过QColor对象设置颜色 # painter.setPen(Qt.GlobalColor.red) # 通过Qt.GlobalColor属性设置颜色 # 给画家设置字体 painter.setFont(QFont('微软雅黑', 30)) # 具体绘画:绘制文本 painter.drawText(event.rect(), Qt.AlignCenter, "失心疯练习绘图") # 结束绘制 painter.end() if __name__ == '__main__': app = QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())
-
功能作用
-
构造方法
QPainter() # 实例化画家 QPainter(QPaintDevice) # 实例化画家的同时设置绘画容器
-
设置画笔颜色、粗细、样式
setPen(color: Union[QColor, Qt.GlobalColor]) # 设置画笔颜色 # QColor对象 # 如:红色:QColor(255,0,0) # Qt.GlobalColor颜色选择器对象 # 如:红色:Qt.GlobalColor.red setPen(pen: Union[QPen, Union[QColor, Qt.GlobalColor]]) # 通过QPen对象设置画笔同时设置颜色 setPen(style: Qt.PenStyle) # 设置画笔线条样式
- 关于QPen对象,详见下面补充内容
-
设置笔刷
setBrush(self, brush: Union[QBrush, Union[QColor, Qt.GlobalColor], QGradient]) setBrush(self, style: Qt.BrushStyle)
- 关于QBrush对象,详见下面补充内容
-
设置字体
setFont(QFont) # 设置绘制文字的字体和大小
-
设置不透明度
setOpacity(float) # 设置不透明度 # 将画家的不透明度设置为不透明度。 # 该值应在 0.0 到 1.0 的范围内, # 其中 0.0 表示完全透明,1.0 表示完全不透明
-
开始绘制
painter.begin(QPaintDevice) # 画家在指定容器上开始绘画
-
常用绘制方法
-
常用绘制方法
-
绘制文本
drawText(p:[QPointF, QPoint], text) drawText(r:QRectF, flags, text) drawText(r:QRect, flags, text) drawText(r:QRectF, text, QTextOption = QTextOption()) drawText(p, text) drawText(x, y, width, height, flags, text) drawText(x, y, text) # 参数说明 # p、r:文本绘制的坐标或者区域 # QPoint:表示一个平面上在整数精度的点坐标 QPoint(x, y) # QPointF:表示一个平面上在浮点精度上的点坐标 QPointF(x.a, y.b) # QRect:使用整数精度定义平面中的矩形区域 QRect(x, y, w, h) # QRectF:使用浮点精度定义平面中的矩形区域 QRectF(x.a, y.b, w.c, h.d) # flags:文本对齐方式 # Qt.AlignCenter # Qt.AlignHCenter # Qt.AlignVCenter # Qt.AlignLeft # Qt.AlignRight # Qt.AlignTop # Qt.AlignBottom # text:要绘制的文本内容
-
绘制线段
# 绘制一条线段(通过两个坐标点确定一条线段) drawLine([QLine, QLineF]) drawLine(x1, y1, x2, y2) drawLine(p1: [QPointF, QPoint], p2: [QPointF, QPoint]) # 绘制多条线 drawLines(lines: Optional[PyQt5.sip.array[QLineF]]) drawLines(line: Optional[QLineF], *args: QLineF) drawLines(pointPairs: Optional[PyQt5.sip.array[Union[QPointF, QPoint]]]) drawLines(pointPair: Optional[Union[QPointF, QPoint]], *args: Union[QPointF, QPoint]) drawLines(lines: Optional[PyQt5.sip.array[QLine]]) drawLines(line: Optional[QLine], *args: QLine) drawLines(pointPairs: Optional[PyQt5.sip.array[QPoint]]) drawLines(pointPair: Optional[QPoint], *args: QPoint) # 参数说明 # QLine表示平面上整数精度的二维向量,用于描述有限长度的直线也就是线段,起点与终点只具有整数精度 QLine(x1, y1, x2, y2) # QLineF表示平面上浮点数精度的二维向量,用于描述有限长度的直线也就是线段,起点与终点只具有浮点数精度 QLineF(x1.a, y1.b, x2.c, y2.d)
-
绘制弧
drawArc(r, a, alen) # 绘制弧线 # r:绘画区域QRect # a:起始幅度,相对于水平线的幅度 # alen:结束幅度,相对于起始位置的幅度 # 这里的幅度单位是alen:1alen = 1/16度。45° = 45 * 16 (alen)
-
绘制带弦的弧
drawChord([QRectF, QRect], a, alen) drawChord(x, y, w, h, a, alen)
-
绘制扇形(饼图)
drawPie([QRectF, QRect], a, alen) drawPie(x, y, w, h, a, alen)
-
绘制椭圆
drawEllipse([QRectF, QRect]) # 在指定区域内绘制内切椭圆 drawEllipse(x, y, w, h) drawEllipse(center: [QPointF, QPoint], rx, ry) # 确定圆心,绘制指定横向/纵向半径椭圆
-
绘制多边形
drawPolygon([QPolygon, QPolygonF], fillRule) drawPolygon(PyQt5.sip.array[[QPointF, QPoint]], fillRule) drawPolygon([QPointF, QPoint], *args)
-
绘制点
drawPoint() # 绘制单个点 drawPoints() # 绘制多个点
-
绘制矩形
drawRect() # 绘制单个矩形 drawRects() # 绘制多个矩形 drawRoundedRect() # 绘制圆角矩形
-
绘制折线
drawPolyline() # 绘制折线(多线段)
-
绘制其他
drawPath() # 绘制路径 drawGlyphRun() # drawPixmapFragments() drawStaticText()
-
绘制图像
drawImage() # 绘制图像 drawPixmap() # 绘制图像,从图像中提取Pixmap并绘制 drawPicture() # 绘制图像,绘制Picture图片 drawTiledPixmap() # 绘制图像 # 处理图像数据的类:QImage, QPixmap和QPicture。 # QImage是为I/O和直接像素访问和操作而设计和优化的 # QPixmap是为在屏幕上显示图像而设计和优化的。 # QPicture类是一个记录和回放QPainter命令的绘制设备 # QImage与QPixmap区别: # 不同平台,依赖、存储不同 # QPixmap依赖于硬件,QImage不依赖于硬件 # 有绘制pixmap/image的函数,即drawPixma()、drawImage()和drawTiledPixmap()。 # drawPixmap()和drawImage()都会产生相同的结果 # 只是drawPixmap()在屏幕上更快,而在QPrinter或其他设备上drawImage()可能更快 # drawPicture()函数可以绘制整个QPicture的内容。 # drawPicture()函数是唯一一个忽略所有绘制设置的函数,因为QPicture有自己的设置 # 补充 QPixmap # copy() # 从QRect对象复制到QPixmap对象 # fromImage() # 将QImage对象转换为QPixmap对象 # grabWidget() # 从给定的窗口小控件创建一个江苏图 # grabWindow() # 在窗口中创建数据的像素图 # load() # 加载图形文件作为QPixmap对象 # save() # 将QPixmap对象保存为文件 # toImage() # 将QPixmap对象转换为QImage对象
-
填充方法
fillPath() # 填充路径 fillRect() # 填充矩形
-
结束绘制
painter.end() # 结束绘画
补充
QPen对象
- 构造方法
QPen() QPen(a0: Qt.PenStyle) QPen(brush: Union[QBrush, Union[QColor, Qt.GlobalColor], QGradient], width: float, style: Qt.PenStyle = Qt.SolidLine, cap: Qt.PenCapStyle = Qt.SquareCap, join: Qt.PenJoinStyle = Qt.BevelJoin) QPen(pen: Union[QPen, Union[QColor, Qt.GlobalColor]]) QPen(variant: Any)
- 常用方法
setColor(Union[QColor, Qt.GlobalColor]) # 设置画笔颜色 setStyle(Qt.PenStyle) # 设置画笔样式 # Qt.NoPen # 没有线 # Qt.SolidLine # 一条简单的线 # Qt.DashLine # 由一些像素分隔的短线 # Qt.DotLine # 由一些像素分隔的点 # Qt.DashDotLine # 轮流交替的点和短线 # Qt.DashDotDotLine # 一条短线、两个点 # Qt.CustomDashLine # 自定义画笔样式 # setDashPattern([int,int,int,int]) # 设置自定义画笔样式 # Qt.MPenStyle # 画笔风格的掩码 setWidth(int) # 设置画笔宽度(粗细) setDashPattern(Iterable[float]) # 使用数字列表自定义画笔样式 setBrush(Union[QBrush, Union[QColor, Qt.GlobalColor], QGradient]) # 设置画刷
- Qt.PenStyle 样式图
- Qt.PenStyle 样式图
- 自定义样式图
# QBrush画刷对象
- 构造方法
QBrush() QBrush(bs: Qt.BrushStyle) QBrush(color: Union[QColor, Qt.GlobalColor], style: Qt.BrushStyle = Qt.SolidPattern) QBrush(color: Union[QColor, Qt.GlobalColor], pixmap: QPixmap) QBrush(pixmap: QPixmap) QBrush(image: QImage) QBrush(brush: Union[QBrush, Union[QColor, Qt.GlobalColor], QGradient]) QBrush(variant: Any) # 参数说明 Qt.BrushStyle # 画刷类型 color # 画刷颜色 # QColor # 使用颜色对象设置颜色 QColor(255,0,0) # Qt.GlobalColor # 使用枚举设置颜色 Qt.GlobalColor.red QGradient # 渐变效果 # QGradient.NoGradient # 不使用渐变 # QGradient.QLinearGradient # 线性渐变 # QGradient.QRadialGradient # 放射性渐变 # QGradient.QConicalGradient # 锥形渐变
- 常用方法
setColor() # 设置画刷颜色。 setTextureImage() # 将画刷图像设置为图像,样式需设置为Qt.TexturePattern。 setTexture() # 将画刷的pixmap设置为QPixmap,样式需设置为Qt.TexturePattern。 setStyle() # 设置画刷样式 # Qt.SolidPattern # 纯色填充样式 # Qt.Dense1Pattern # 密度样式1 # Qt.Dense2Pattern # 密度样式2 # Qt.Dense3Pattern # 密度样式3 # Qt.Dense4Pattern # 密度样式4 # Qt.Dense5Pattern # 密度样式5 # Qt.Dense6Pattern # 密度样式6 # Qt.Dense7Pattern # 密度样式7 # Qt.HorPattern # 水平线样式 # Qt.VerPattern # 垂直线样式 # Qt.CrossPattern # 交叉线样式 # Qt.DiagCrossPattern # 倾斜交叉线样式 # Qt.BDiagPattern # 反倾斜样式 # Qt.FDiagPattern # 倾斜样式 # Qt.LinearGradientPattern # 线性渐变样式 # Qt.ConiclaGradientPattern # 锥形渐变样式 # Qt.RadialGradientPattern # 放射渐变样式 # Qt.TexturePattern # 纹理样式
- Qt.BrushStyle 样式
- Qt.BrushStyle 样式
示例
-
示例1:画笔类型
import sys from PyQt5.Qt import * class Drawing(QWidget): def __init__(self): super(Drawing, self).__init__() self.resize(800, 380) self.setWindowTitle('失心疯测试_画笔类型') self.show() def paintEvent(self, e): # 纵向标题 pai = QPainter() pai.begin(self) pai.setPen(QColor(255, 0, 0)) pai.drawText(20, 80, 'Qt.NoPen') pai.drawText(20, 130, 'Qt.SolidLine') pai.drawText(20, 180, 'Qt.DashLine') pai.drawText(20, 230, 'Qt.DotLine') pai.drawText(20, 280, 'Qt.DashDotLine') pai.drawText(20, 330, 'Qt.DashDotDotLine') # 横向标题 pai.setPen(QColor(0, 0, 0)) pai.setFont(QFont('宋体', 10)) pai.drawText(200, 30, 'setWidth(0)') pai.drawText(350, 30, 'setWidth(2)') pai.drawText(500, 30, 'setWidth(3)') pai.drawText(650, 30, 'setWidth(4)') # 线条 painter = QPainter() painter.begin(self) pen = QPen(Qt.NoPen) pen.setWidth(0) painter.setPen(pen) painter.drawLine(200, 80, 300, 80) pen.setWidth(2) painter.setPen(pen) painter.drawLine(350, 80, 450, 80) pen.setWidth(3) painter.setPen(pen) painter.drawLine(500, 80, 600, 80) pen.setWidth(4) painter.setPen(pen) painter.drawLine(650, 80, 750, 80) pen = QPen() pen.setStyle(Qt.SolidLine) pen.setWidth(0) painter.setPen(pen) painter.drawLine(200, 130, 300, 130) pen.setWidth(2) painter.setPen(pen) painter.drawLine(350, 130, 450, 130) pen.setWidth(3) painter.setPen(pen) painter.drawLine(500, 130, 600, 130) pen.setWidth(4) painter.setPen(pen) painter.drawLine(650, 130, 750, 130) pen = QPen() pen.setStyle(Qt.DashLine) pen.setWidth(0) painter.setPen(pen) painter.drawLine(200, 180, 300, 180) pen.setWidth(2) painter.setPen(pen) painter.drawLine(350, 180, 450, 180) pen.setWidth(3) painter.setPen(pen) painter.drawLine(500, 180, 600, 180) pen.setWidth(4) painter.setPen(pen) painter.drawLine(650, 180, 750, 180) pen = QPen() pen.setStyle(Qt.DotLine) pen.setWidth(0) painter.setPen(pen) painter.drawLine(200, 230, 300, 230) pen.setWidth(2) painter.setPen(pen) painter.drawLine(350, 230, 450, 230) pen.setWidth(3) painter.setPen(pen) painter.drawLine(500, 230, 600, 230) pen.setWidth(4) painter.setPen(pen) painter.drawLine(650, 230, 750, 230) pen = QPen() pen.setStyle(Qt.DashDotLine) pen.setWidth(0) painter.setPen(pen) painter.drawLine(200, 280, 300, 280) pen.setWidth(2) painter.setPen(pen) painter.drawLine(350, 280, 450, 280) pen.setWidth(3) painter.setPen(pen) painter.drawLine(500, 280, 600, 280) pen.setWidth(4) painter.setPen(pen) painter.drawLine(650, 280, 750, 280) pen = QPen() pen.setStyle(Qt.DashDotDotLine) pen.setWidth(0) painter.setPen(pen) painter.drawLine(200, 330, 300, 330) pen.setWidth(2) painter.setPen(pen) painter.drawLine(350, 330, 450, 330) pen.setWidth(3) painter.setPen(pen) painter.drawLine(500, 330, 600, 330) pen.setWidth(4) painter.setPen(pen) painter.drawLine(650, 330, 750, 330) QBrush() painter.end() if __name__ == '__main__': app = QApplication(sys.argv) demo = Drawing() demo.show() sys.exit(app.exec_())
-
示例2:设置画刷
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import Qt, QPoint class MyWindow(QWidget): def __init__(self, parent=None): super(MyWindow, self).__init__(parent) self.resize(600, 300) # 设置窗口大小 self.setWindowTitle("失心疯_画刷样式") # 设置窗口标题 def paintEvent(self, event): painter = QPainter(self) # 创建绘图对象 brush = QBrush() # 创建画刷对象 # 创建第1列的矩形及标识文字 # 设置第1个矩形的画刷 brush.setColor(Qt.GlobalColor.yellow) # 设置画刷颜色 brush.setStyle(Qt.SolidPattern) # 设置画刷样式为纯色样式 painter.setBrush(brush) # 设置画刷 painter.drawRect(10, 10, 30, 30) # 绘制矩形 painter.drawText(50, 30, "纯色样式") # 绘制标识文本 # 创建第2列的矩形及标识文字 # 设置第1个矩形的画刷 brush.setColor(Qt.GlobalColor.cyan) # 设置画刷颜色 brush.setStyle(Qt.Dense1Pattern) # 设置画刷样式为密度样式1 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 10, 30, 30) # 绘制矩形 painter.drawText(190, 30, "密度样式1") # 绘制标识文本 # 设置第2个矩形和画刷 brush.setColor(Qt.GlobalColor.black) # 设置画刷颜色 brush.setStyle(Qt.Dense2Pattern) # 设置画刷样式为密度样式2 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 50, 30, 30) # 绘制矩形 painter.drawText(190, 70, "密度样式2") # 绘制标识文本 # 设置第3个矩形和画刷 brush.setColor(Qt.GlobalColor.red) # 设置画刷颜色 brush.setStyle(Qt.Dense3Pattern) # 设置画刷样式为密度样式3 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 90, 30, 30) # 绘制矩形 painter.drawText(190, 110, "密度样式3") # 绘制标识文本 # 设置第4个矩形和画刷 brush.setColor(Qt.GlobalColor.green) # 设置画刷颜色 brush.setStyle(Qt.Dense4Pattern) # 设置画刷样式为密度样式4 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 130, 30, 30) # 绘制矩形 painter.drawText(190, 150, "密度样式4") # 绘制标识文本 # 设置第5个矩形和画框 brush.setColor(Qt.GlobalColor.darkRed) # 设置画刷颜色 brush.setStyle(Qt.Dense5Pattern) # 设置画刷样式为密度样式5 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 170, 30, 30) # 绘制矩形 painter.drawText(190, 190, "密度样式5") # 绘制标识文本 # 设置第6个矩形的画刷 brush.setColor(Qt.GlobalColor.darkGray) # 设置画刷颜色 brush.setStyle(Qt.Dense6Pattern) # 设置画刷样式为密度样式6 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 210, 30, 30) # 绘制矩形 painter.drawText(190, 230, "密度样式 6") # 绘制标识文本 # 设置第7个矩形的画刷 brush.setColor(Qt.GlobalColor.magenta) # 设置画刷颜色 brush.setStyle(Qt.Dense7Pattern) # 设置画刷样式为密度样式7 painter.setBrush(brush) # 设置画刷 painter.drawRect(150, 250, 30, 30) # 绘制矩形 painter.drawText(190, 270, "密度样式 7") # 绘制标识文本 # 创建第3列的矩形及标识文字 # 设置第1个矩形的画刷 brush.setColor(Qt.GlobalColor.magenta) # 设置画刷颜色 brush.setStyle(Qt.HorPattern) # 设置画刷样式为水平线样式 painter.setBrush(brush) # 设置画刷 painter.drawRect(300, 10, 30, 30) # 绘制矩形 painter.drawText(340, 30, "水平线样式") # 设置第2个矩形的画刷 brush.setColor(Qt.GlobalColor.red) brush.setStyle(Qt.VerPattern) # 设置画刷样式为垂直线样式 painter.setBrush(brush) # 设置画刷 painter.drawRect(300, 50, 30, 30) # 绘制矩形 painter.drawText(340, 70, "垂直线样式") # 设置第3个矩形的画刷 brush.setColor(Qt.GlobalColor.cyan) brush.setStyle(Qt.CrossPattern) painter.setBrush(brush) painter.drawRect(300, 90, 30, 30) painter.drawText(340, 110, "交叉线样式") # 设置第4个矩形的画刷 brush.setColor(Qt.GlobalColor.black) brush.setStyle(Qt.DiagCrossPattern) painter.setBrush(brush) painter.drawRect(300, 130, 30, 30) painter.drawText(340, 150, "倾斜交叉线样式") # 设置第5个矩形的画刷 brush.setColor(Qt.GlobalColor.darkCyan) brush.setStyle(Qt.BDiagPattern) painter.setBrush(brush) painter.drawRect(300, 170, 30, 30) painter.drawText(340, 190, "反斜线样式") # 设置第6个矩形的画刷 brush.setColor(Qt.GlobalColor.blue) brush.setStyle(Qt.FDiagPattern) painter.setBrush(brush) painter.drawRect(300, 210, 30, 30) painter.drawText(340, 230, "倾斜样式") # 创建第4列的矩形及标识文字 # 设置线性渐变区域 linearCradient = QLinearGradient(QPoint(460, 10), QPoint(490, 40)) linearCradient.setColorAt(0, Qt.GlobalColor.black) # 设置渐变色1 linearCradient.setColorAt(1, Qt.GlobalColor.yellow) # 设置渐变色2 linearbrush = QBrush(linearCradient) # 创建线性渐变画刷 linearbrush.setStyle(Qt.LinearGradientPattern) # 设置画刷样式为线性渐变样式 painter.setBrush(linearbrush) # 设置画刷 painter.drawRect(460, 10, 30, 30) # 绘制矩形 painter.drawText(500, 30, "线性渐变样式") # 设置锥形渐变区域 conicalGradient = QConicalGradient(475, 65, 0) # 将要渐变的区域分为6个区域,分别设置颜色 conicalGradient.setColorAt(0.0, Qt.GlobalColor.white) conicalGradient.setColorAt(0.2, Qt.GlobalColor.red) conicalGradient.setColorAt(0.4, Qt.GlobalColor.cyan) conicalGradient.setColorAt(0.6, Qt.GlobalColor.yellow) conicalGradient.setColorAt(0.8, Qt.GlobalColor.black) conicalGradient.setColorAt(1.0, Qt.GlobalColor.magenta) conicalbrush = QBrush(conicalGradient) # 创建锥形渐变画刷 conicalbrush.setStyle(Qt.ConicalGradientPattern) # 设置画刷样式为锥形渐变样式 painter.setBrush(conicalbrush) # 设置画刷 painter.drawRect(460, 50, 30, 30) # 绘制矩形 painter.drawText(500, 70, "锥形渐变样式") # 绘制标识文本 # 设置放射渐变区域 radialGradient = QRadialGradient(QPoint(475, 105), 15) radialGradient.setColorAt(0, Qt.GlobalColor.yellow) # 设置中心点颜色 radialGradient.setColorAt(0.5, Qt.GlobalColor.magenta) # 设置内圈颜色 radialGradient.setColorAt(1, Qt.GlobalColor.darkMagenta) # 设置外圈颜色 radialbrush = QBrush(radialGradient) # 创建放射渐变画刷 radialbrush.setStyle(Qt.RadialGradientPattern) # 设置画刷样式为放射渐变样式 painter.setBrush(radialbrush) # 设置画刷 painter.drawRect(460, 90, 30, 30) # 绘制矩形 painter.drawText(500, 110, "放射渐变样式") # 绘制标识文本 # 设置第6个矩形的画刷 brush.setStyle(Qt.TexturePattern) # 设置画刷样式为纹理样式 brush.setTexture(QPixmap("a.jpg")) # 设置作为纹理的图片 painter.setBrush(brush) # 设置画刷 painter.drawRect(460, 130, 30, 30) # 绘制矩形 painter.drawText(500, 150, "纹理样式") # 绘制标识文本 if __name__ == "__main__": app = QApplication(sys.argv) demo = MyWindow() demo.show() sys.exit(app.exec_())
-
示例3:简单绘制(文本、线段)
from PyQt5.Qt import * import sys class MyWindow(QWidget): def __init__(self): super(MyWindow, self).__init__() self.resize(500, 900) self.setWindowTitle('QPainter简单绘制') def paintEvent(self, event): # 实例化一个画家 painter = QPainter() # 在指定容器上开始绘制 painter.begin(self) # 设置画笔 pen = QPen() # 创建画笔 pen.setStyle(Qt.SolidLine) # 设置画笔样式 pen.setColor(Qt.red) # 设置画笔颜色 painter.setPen(pen) # 给画家设置画笔 # 给画家设置字体 painter.setFont(QFont('微软雅黑', 20)) # 绘制具体内容 # ===================== 绘制文本 -- 开始 ===================== # # 绘制文本1 painter.drawText(QPoint(50, 250), '失心疯学习PyQt5') # # 绘制文本2 rect = QRect(50, 50, 400, 50) painter.drawText(rect, Qt.AlignCenter, '失心疯学习PyQt5') # # 绘制文本3 painter.drawText(50, 100, 400, 50, Qt.AlignCenter, '失心疯学习PyQt5') # # 绘制文本4 painter.drawText(50, 200, '失心疯学习PyQt5') # ===================== 绘制文本 -- 结束 ===================== # ===================== 绘制线段 -- 开始 ===================== # 绘制一条线段 # # 绘制一条线段1 painter.setPen(Qt.black) painter.drawLine(QLine(50, 300, 400, 300)) # # 绘制一条线段2 painter.drawLine(50, 320, 400, 320) # # 绘制一条线段3 painter.drawLine(QPoint(50, 340), QPoint(400, 340)) # 绘制多条线段 # # 绘制多条线段1 painter.setPen(Qt.blue) painter.drawLines([QLine(50, 360, 400, 360),QLine(50, 380, 400, 380),QLine(50, 400, 400, 400)]) # # 绘制多条线段2 painter.setPen(Qt.green) painter.drawLines(QLine(50, 420, 400, 420),QLine(50, 440, 400, 440),QLine(50, 460, 400, 460)) # # 绘制多条线段3 painter.setPen(Qt.magenta) painter.drawLines([QPoint(50, 480),QPoint(400, 480),QPoint(50, 500),QPoint(400, 500),QPoint(50, 520),QPoint(400, 520)]) # # 绘制多条线段4 painter.setPen(Qt.cyan) painter.drawLines(QPoint(50, 540), QPoint(400, 540), QPoint(50, 560), QPoint(400, 560), QPoint(50, 580), QPoint(400, 580)) # ===================== 绘制线段 -- 结束 ===================== # 结束绘制 painter.end() if __name__ == '__main__': app = QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())
-
示例4:复杂绘制(弧、弦、扇形、椭圆、图像)
from PyQt5.Qt import * import sys class MyWindow(QWidget): def __init__(self): super(MyWindow, self).__init__() self.resize(600, 1200) self.setWindowTitle('QPainter绘制各种图形') def paintEvent(self, event): painter = QPainter() painter.begin(self) # ===================== 绘制弧 -- 开始 ===================== # # 绘制弧1 painter.setPen(Qt.red) rect = QRect(50, 10, 100, 100) # 设置一个区域对象 QRect(aleft, atop, awidth, aheight) # drawArc(r, a, alen) r:绘画区域,a:起始幅度,相对于水平线的幅度,alen:结束幅度,相对于起始位置的幅度 # 这里的幅度单位是alen:1alen = 1/16度。45° = 45 * 16 (alen) painter.drawArc(rect, 0, 45 * 16) painter.setPen(Qt.blue) painter.drawArc(rect, 45 * 16, 90 * 16) # # 绘制弧2 painter.drawArc(170, 10, 100, 100, 0, 45 * 16) painter.drawArc(170, 10, 200, 200, 45 * 16, 90 * 16) # 使用绘制弧画圆 painter.setPen(Qt.red) painter.drawArc(390, 10, 100, 100, 0, 360 * 16) # ===================== 绘制弧 -- 结束 ===================== # ===================== 绘制带弦的弧 -- 开始 ===================== # 绘制带弦的弧1 rect = QRect(50, 120, 100, 100) painter.drawChord(rect, 0, 90 * 16) # 绘制带弦的弧2 painter.drawChord(170, 120, 100, 100, 0, 90 * 16) painter.drawChord(290, 120, 100, 100, 0, 180 * 16) # ===================== 绘制带弦的弧 -- 结束 ===================== # ===================== 绘制扇形 -- 开始 ===================== # # 绘制扇形1 rect = QRect(50, 240, 100, 100) painter.drawPie(rect, 0, 90 * 16) # # 绘制扇形2 painter.drawPie(170, 240, 100, 100, 0, 45 * 16) # ===================== 绘制扇形 -- 结束 ===================== # ===================== 绘制椭圆 -- 开始 ===================== # # 绘制椭圆1 rect = QRect(50, 360, 100, 100) painter.drawEllipse(rect) rect = QRect(170, 360, 100, 50) painter.drawEllipse(rect) # # 绘制椭圆2 painter.drawEllipse(290, 360, 100, 50) # # 绘制椭圆3 painter.drawEllipse(QPoint(460, 410), 50, 25) # ===================== 绘制椭圆 -- 结束 ===================== # ===================== 绘制多边形 -- 开始 ===================== # # 绘制六边形1 p1 = QPoint(100, 530) # 顶部点坐标 p2 = QPoint(50, 580) # 左上点坐标 p3 = QPoint(50, 630) # 左下点坐标 p4 = QPoint(100, 680) # 底部点坐标 p5 = QPoint(150, 630) # 右下点坐标 p6 = QPoint(150, 580) # 右上点坐标 pol = QPolygon([p1, p2, p3, p4, p5, p6]) painter.drawPolygon(pol) # # 绘制六边形2 painter.drawPolygon([QPoint(220, 530), QPoint(170, 580), QPoint(170, 630), QPoint(220, 680), QPoint(270, 630), QPoint(270, 580)]) # # 绘制六边形3 painter.drawPolygon(QPoint(340, 530), QPoint(290, 580), QPoint(290, 630), QPoint(340, 680), QPoint(390, 630), QPoint(390, 580)) # ===================== 绘制多边形 -- 结束 ===================== # ===================== 绘制图像 -- 开始 ===================== # # 绘制图像1 # # # 1. 装载图像 img = QImage('a.jpg') # # # 2. 设置绘画区域 rect = QRect(50, 700, int(img.width()/5), int(img.height()/5)) # # # 3. 绘制图像 painter.drawImage(rect, img) # # 绘制图像2 pix = QPixmap('dog.jpg') rect = QRect(250, 700, int(pix.width()/5), int(pix.height()/5)) painter.drawPixmap(rect, pix) # # 绘制图像3 pix = QPixmap('dog2.jpg') rect = QRect(500, 700, int(pix.width()/5), int(pix.height()/5)) painter.drawTiledPixmap(rect, pix) # ===================== 绘制图像 -- 结束 ===================== painter.end() if __name__ == '__main__': app = QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())
-
示例5:绘制QPicture对象
from PyQt5.Qt import * import sys class MyWindow(QWidget): def __init__(self): super(MyWindow, self).__init__() self.resize(500, 600) self.setWindowTitle('绘制QPicture对象') def paintEvent(self, event) -> None: # 创建画家1 painter = QPainter() painter.begin(self) # 创建一个 QPicture 对象 picture = QPicture() # 创建画家2,开始绘画。并将保存绘图操作到QPicture对象 pain = QPainter(picture) img = QImage('a.jpg') rect = QRect(0,0, int(img.width()/2), int(img.height()/2)) pain.drawImage(rect, img) pain.end() # 使用画家1将QPicture对象绘画到窗体上 painter.drawPicture(10, 0, picture) painter.drawPicture(10, 300, picture) painter.end() if __name__ == '__main__': app = QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())