112.PyQt5_QPainter_图形绘制控件

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
优 质 教 程 推 荐:👉👉 Python爬虫从入门到入狱系列 合集👈👈

分隔线

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 样式图
      • 在这里插入图片描述
  • 自定义样式图
    • 在这里插入图片描述

# 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 样式
      在这里插入图片描述

示例
  • 示例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_())
    
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失心疯_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值