120.PyQt5_QPainter_图形绘制控件

news2024/11/20 3:37:50

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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 样式图
      • 在这里插入图片描述
  • 自定义样式图
    • 在这里插入图片描述

# 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_())
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第6章:6.1 文本格式化 (MATLAB入门课程)

讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 在数据处理与报告生成的过程中,我们经常需要将数据转…

AI“造神运动”终结,杀死,重生

AGI回归本质,百亿美金创业机会涌现。 “专注AI技术迭代会让我焦虑,关注业务我不会焦虑,有些问题十年前存在十年后还在,我现在就明确不卷模型,只思考如何让产品能自我‘造血’。” 一位正卷在AI创业洪流里的硅谷创业者…

重学SpringBoot3-WebMvcConfigurer接口

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-WebMvcConfigurer接口 WebMvcConfigurer基本信息为什么WebMvcConfigurer能配置底层行为实现WebMvcConfigurer举例1. 自定义格式化器和转换器2. 添加拦截…

AI新工具(20240313) 世界上第一个完全自主的AI软件工程师Devin 已经开始接外包了;又一个开源本地知识库问答系统

1: Cognition AI Devin 世界上第一个完全自主的AI软件工程师Devin 已经开始接外包了 Devin是世界上第一个完全自主的AI软件工程师,具备长期推理和规划的能力,能够执行复杂的工程任务,包括学习、修复错误、与用户实时合作等。Devin可以学习并…

200W年薪的大佬 随手丢给我“Spring速成宝典”看完这些知识点直接定级P7

面试官:答的很好,最后一个问题:如果没有Spring,你打算怎么开展工作? 这个思考了几分钟后,程序员小建是这么回答的:Spring的核心源码,比如:IOC、AOP、Spring事务、MVC原理…

土木工程设计系列-基于规范的简单基础工程自动设计

土木工程设计系列-基于规范的简单基础工程自动设计 土木工程设计系列-基于规范的简单基础工程自动设计 土木工程设计系列-基于规范的简单基础工程自动设计前言基础工程设计简介程序组成源码文件树文件说明:程序执行流程 部分接口介绍程序使用源码获取 前言 本文为土…

高精度三维扫描测量服务3d扫描仪抄数工业级精密激光扫描建模设计

在工业设计与制造领域,工业3D扫描仪的应用日益广泛,其“抄数设计”的功能更是备受瞩目。抄数设计,简单来说,就是通过3D扫描仪对实物进行精确测量,快速获取其三维数据,并基于这些数据进行设计、分析和优化。…

快速排序 刷题笔记

思路 分治双指针 在每个区间选定一个基准目标 两个指针从数组的两边向中间推进 使用 while循环判断 do {i;}while(q[i]<x); do{j--;}while(q[j]>x); 每次这样做完就会找到q[i]>x,,,,q[j]小于x 此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大…

离散化算法,以Acwing802.区间和为例子(C++实现)

目录 1.例题2.算法实现思路3.代码 1.例题 假定有一个无限长的数轴&#xff0c;数轴上每个坐标上的数都是 0现在&#xff0c;我们首先进行 n 次操作&#xff0c;每次操作将某一位置 x 上的数加 c接下来&#xff0c;进行 m 次询问&#xff0c;每个询问包含两个整数 l 和 r&#…

【五】prometheus+grafna初步部署和简单使用

部署Prometheus 地址: https://github.com/prometheus-operator/kube-prometheus/tree/release-0.7 学习来源&#xff1a;https://www.cnblogs.com/lidong94/p/14500276.html、https://juejin.cn/post/6865504989695967245?searchId20240312205710B746697AB0CDB7706DB3 我使用…

人事地震,京东方多名董事离职 | 百能云芯

3月12日&#xff0c;京东方公布了《关于董事辞职的公告》&#xff0c;公告内容显示&#xff1a;董事会于2024年3月12日收到副董事长刘晓东先生、董事孙芸女士提交的书面辞呈。 双方离职原因均系年龄原因&#xff0c;刘晓东先生申请辞去公司董事、副董事长、董事会专门委员会委员…

深入理解Hive:探索不同的表类型及其应用场景

文章目录 1. 引言2. Hive表类型概览2.1 按照数据存储位置2.2 按照数据管理方式2.3 按照查询优化2.4 按照数据的临时性和持久性 3. 写在最后 1. 引言 在大数据时代&#xff0c;Hive作为一种数据仓库工具&#xff0c;为我们提供了强大的数据存储和查询能力。了解Hive的不同表类型…

原理+代码:Diffusion Model 直观理解

原理部分 直观理解 数学形式 网络如何训练&#xff1f; 训练一个怎样的网络&#xff1f; 代码部分 Network helpers Positional embeddings ResNet/ConvNeXT block Attention module Conditional U-Net 定义前向扩散过程 用一个实例来说明前向加噪过程 损失函数 …

基于SSH框架的电子商城的设计

目录 摘要 2 Abstract 3 第一章 前言 4 1.1 课题研究意义 4 1.2 国外研究现状 4 方案一&#xff1a; 4 方案二&#xff1a; 4 方案三&#xff1a; 5 1.3 课题研究内容 5 &#xff08;1&#xff09;商品浏览模块 5 &#xff08;2&#xff09;订单管理模块 5 &#xff08;3&…

基于 llvm 3.4 的C++重构工具

还未测试&#xff0c;存个档&#xff0c;未完待续 1,源码 Makefile LLVM_CONFIG?llvm-configifndef VERBOSE QUIET: endifSRC_DIR?$(PWD) LDFLAGS$(shell $(LLVM_CONFIG) --ldflags) COMMON_FLAGS-Wall -Wextra CXXFLAGS$(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags…

【机器学习300问】36、什么是集成学习?

一、什么是集成学习&#xff1f; &#xff08;1&#xff09;它的出现是为了解决什么问题&#xff1f; 提高准确性&#xff1a;单个模型可能对某些数据敏感或者有概念偏见&#xff0c;而集成多个模型可以提高预测的准确性。让模型变稳定&#xff1a;一些模型&#xff0c;如决策…

【JavaScript】数据类型转换 ① ( 隐式转换 和 显式转换 | 常用的 数据类型转换 | 转为 字符串类型 方法 )

文章目录 一、 JavaScript 数据类型转换1、数据类型转换2、隐式转换 和 显式转换3、常用的 数据类型转换4、转为 字符串类型 方法 一、 JavaScript 数据类型转换 1、数据类型转换 在 网页端 使用 HTML 表单 和 浏览器输入框 prompt 函数 , 接收的数据 是 字符串类型 变量 , 该…

[密码学]OpenSSL实践篇

背景 最近在写Android abl阶段fastboot工具&#xff0c;需要我在Android代码中实现一些鉴权加解密相关的fastboot命令&#xff0c;里面用到了OpenSSL。我们先来实践一下OpenSSL在Linux系统中的指令。 OpenSSL官方网站&#xff1a;OpenSSL 中文手册 | OpenSSL 中文网 1. 查看…

【变量提升】关于JavaScript变量提升的理解,它导致了什么问题?

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

带你摸透C语言相关内存函数

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…