zoukankan      html  css  js  c++  java
  • pyqt5-paintEvent运行机制

    原文链接: https://blog.csdn.net/marwenx/article/details/116158966

    pyqt支持一些简单的画图操作,比如画点或者画线等一些简单的操作。

    首先是原理,就是重写paintEvent()方法实现画图(可能接触pyqt不久的话对这种实现方式感觉有点奇怪,建议先别管背后的原理,不是说就不学原理了,先会用再去关注原理,前期可以完成任务,学会原理后出现问题后,定位相关问题也比较容易)

    pyqt对这种画图操作并不是提供一个直接使用的方法,而是需要重写一个方法,并且具体调用的过程也隐藏了起来,这就让新手和后面定位问题带来了些许麻烦。

    以下是demo

    画点

    首先是需要import的

    # 需要import qt相关的
    from PyQt5.QtWidgets import QWidget, QApplication
    from PyQt5.QtGui import QPainter, QColor, QPen

    # 需要import 其他
    import sys
    import random
    完整demo代码

    # -*- coding: utf-8 -*-

    from PyQt5.QtWidgets import QWidget, QApplication
    from PyQt5.QtGui import QPainter, QColor, QPen
    import sys
    import random

    class ExcelWindow(QWidget):
    def __init__(self):
    super(ExcelWindow,self).__init__()
    self.init_ui()

    def init_ui(self):
    self.resize(200,200)

    def paintEvent(self, event):
    qp = QPainter()
    qp.begin(self)

    # 绘图的方法就写在这里就好,begin与end之间
    self.drewDot(qp)

    qp.end()

    def drewDot(self,qp):
    pen = QPen(QColor(238,0,0),3)
    qp.setPen(pen) # 对画笔进行设置,QColor参数为颜色的rgb值,后面3为点的大小
    print(self.size()) # 确认下能画画的画布像素范围
    # 随机画几个点
    for i in range(20):
    # drawPoint的参数有两个,一个是点的横坐标,一个是点的纵坐标
    qp.drawPoint(random.randint(0,199), random.randint(0,199))
    def main():
    app = QApplication(sys.argv)
    gui = ExcelWindow()
    gui.show()
    sys.exit(app.exec_())

    if __name__ == '__main__':
    main()

    然后是运行出来的结果

    画线

    首先是需要import的

    # 需要import qt相关的
    from PyQt5.QtWidgets import QWidget, QApplication
    from PyQt5.QtGui import QPainter, QColor, QPen

    # 需要import 其他
    import sys
    import random
    完整demo代码

    # -*- coding: utf-8 -*-

    from PyQt5.QtWidgets import QWidget, QApplication
    from PyQt5.QtGui import QPainter, QColor, QPen
    from PyQt5.QtCore import Qt

    import sys
    import random
    '''
    天依蓝 #66ccff 102,204,255
    初音绿 #66ffcc 102,255,204
    言和绿 #99ffff 153,255,255
    阿绫红 #ee0000 238,0,0
    双子黄 #ffff00 255,255,0
    '''

    class ExcelWindow(QWidget):
    def __init__(self):
    super(ExcelWindow,self).__init__()
    self.init_ui()

    def init_ui(self):
    self.resize(200,200)

    def paintEvent(self, event):
    qp = QPainter()
    qp.begin(self)

    # 绘图的方法就写在这里就好,begin与end之间
    self.drewLines(qp)

    qp.end()

    def drewLines(self,qp):
    pen = QPen(QColor(238,0,0), 2, Qt.SolidLine)
    qp.setPen(pen) # 对画笔进行设置,QColor参数为颜色的rgb值,后面2为线的宽,Qt.SolidLine是线的种类
    print(self.size()) # 确认下能画画的画布像素范围
    # 随机画几个线段
    for i in range(5):
    # 四个参数分别是横坐标的起始位置,纵坐标的起始位置,横坐标的最终位置,纵坐标的最终位置
    qp.drawLine(random.randint(0,199), random.randint(0,199), random.randint(0,199), random.randint(0,199))
    def main():
    app = QApplication(sys.argv)
    gui = ExcelWindow()
    gui.show()
    sys.exit(app.exec_())

    if __name__ == '__main__':
    main()
    画文字

    写到这这个编辑器卡bug了,辣鸡。。。。。算逑,不写画文字的代码了,跟上面差不多。

    顺手贴下v家的色值吧

    '''
    天依蓝 #66ccff 102,204,255
    初音绿 #66ffcc 102,255,204
    言和绿 #99ffff 153,255,255
    阿绫红 #ee0000 238,0,0
    双子黄 #ffff00 255,255,0
    '''
    然后是这个setPen的参数(设置用于绘制的笔的颜色、大小和样式)

    颜色可以用QColor,参数可以写rgb三个值也可以直接写qt内置的颜色

    QColor(238,0,0)
    QColor(Qt.green)
    样式如下表格

    参数 描述
    Qt.NoPen 没有线
    Qt.SolidLine 一条简单的线
    Qt.DashLine 由一些像素分隔的短线
    Qt.DotLine 由一些像素分隔得点
    Qt.DashDotLine 轮流交替的点和短线
    Qt.DashDotDotLine 一条短线、两个点
    Qt.MPenStyle 画笔风格的掩码

    还有这个的基本原理,新手的话看类和方法里面都没有直接调用这个paintEvent,它怎么就能画出来了?

    一个基本的理解啊,就是这个paintEvent已经涉及到pyqt的窗口内部机制了,建议别太重度使用,它的使用机制和刷新机制都不是很容易理解的,也就是一个方法的调用和刷新很可能都不在你的控制下,当然如果理解了机制之后再使用就比较容易控制了。

    首先是使用,这个paintEvent不能直接调用,而是需要重写好相关内部的操作后等待窗口的绘制事件。

    绘制的自动触发机制如下:

    窗口第一次显示时,
    窗口大小调整时,
    窗口切换或遮挡,
    以上操作系统会自动产生一个绘图事件,强制这个paintEvent的运行;

    绘制的”手动“触发机制:

    这里的手动不是手动操作正在运行的窗口程序,而是在程序中使用update或者repaint进行重绘

    repaint()函数会强制产生一个即时的重绘事件;
    update()函数只是在Qt下一次处理事件时才调用一次绘制事件
    多次调用update(),Qt会把连续多次的绘制事件压缩成一个单一的绘制事件,这样可避免闪烁现象。

    所以建议在需要重绘的时候尽量使用update,在必须实时显示绘制的时候使用repaint

    self.update()
    ————————————————
    版权声明:本文为CSDN博主「Marvin_Xavier」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/marwenx/article/details/116158966

  • 相关阅读:
    远程调用丢失请求头与定义RequestInterceptor
    RabbitMQ 高级特性
    注解@ConfigurationProperties使用方法
    Redisson
    分布式缓存
    DEA 无法显示 Run Dashboard 的解决方法
    node多版本切换
    springboot整合amazonS3,封装上传文件接口
    Maven报错:The packaging for this project did not assign a file to the build artifact
    Nodejs介绍及npm工具使用
  • 原文地址:https://www.cnblogs.com/GavinSimons/p/15067938.html
Copyright © 2011-2022 走看看