注册 登录

清河洛

pyside中的事件处理及基础事件

qingheluo2024-10-30清河洛351
在pyside的事件处理中,采用了一种被称之为信号和槽的机制当一个组件发生了某个事件时,会通过信号(Signals)发送该事件已经触发的信息,接收到该信号的槽(Slots)会进行相关的处理简单来讲,信号就是当事件发生时发送的信息,槽就是处理该信息的函数或方法信号和槽通过组件的obj.signal.connect(solt)方法将该信号与要槽绑定一个信号可以多次进行槽函数的绑定以达到运行多个处理程序的目录一个槽函数可以被多个信号绑定以执行相关的处理QtCore.Signal类实现了信号实例对象的创建Signal(*type[, name=None]) 位置参数表示该信号可接受的参数...

在pyside的事件处理中,采用了一种被称之为信号和槽的机制

当一个组件发生了某个事件时,会通过信号(Signals)发送该事件已经触发的信息,接收到该信号的槽(Slots)会进行相关的处理

简单来讲,信号就是当事件发生时发送的信息,槽就是处理该信息的函数或方法

信号和槽通过组件的obj.signal.connect(solt)方法将该信号与要槽绑定

一个信号可以多次进行槽函数的绑定以达到运行多个处理程序的目录

一个槽函数可以被多个信号绑定以执行相关的处理

QtCore.Signal类实现了信号实例对象的创建

Signal(*type[, name=None])
    位置参数表示该信号可接受的参数类型,可以有若干个或0个
    命名参数指定该信号的名称,默认使用指向该实例对象的变量名
    sig1 = Signal(int)
    sig2 = Signal(Qt.CheckState)  // 单选或复选按钮状态码
    sig3 = Signal(int,int,str)    // 接受三个参数

    泛类型:以list或tuple传入参数,表示接收的数据类型为其中任意组合
    sig1 = Signal([int,int],[str,str])
        表示该信号接受参数为2个,类型为int或者str
    sig2 = Signal([int],[str])
        表示该信号接受参数为1个,类型为int或者str

在定义信号实例对象时,即使指定了想要接受的数据类型,但是实际接收到的仍是传递的数据的实际数据类型,即使数据类型不符也不会报错

在定义信号实例对象时,唯一要严格遵守的是参数数量,在发送信号时,传递的参数数量必须完全一致

QtCore.Object类拓展实现了Signal的绑定及发送

Signal实例对象拓展的方法
Signal.connect(solt)    将该信号与槽函数绑定
Signal.disconnect(solt) 将该信号与槽函数解绑
Signal.emit(*args)      发送信号给所有绑定的槽函数


from PySide6.QtCore import QObject, Signal

class myGui(QObject):
    sig = Signal(int,int)
        # 创建有2个建议为int类型参数的信号
    def run(self,x,y):
        # 创建与Signal参数数量相同的槽函数用于接收该Signal
        print(x,y)

mygui = myGui()
mygui.sig.connect(mygui.run)
    # 将信号与槽函数绑定
mygui.sig.emit(1,2)
    # 发送信息

以上代码实现了自定义信号和槽函数并将信号与槽函数绑定,最后发送信号

但是该信号仅仅会发送一次,相当于仅仅会执行一次槽函数,这样并没有体现信号的强大

如果需要信号在每次需要的时候都可以发送,需要配合事件函数

当指定事件发生时,会自动运行指定的事件函数,在事件函数中可以完成信息的处理及信号的发送,这样就实现了每次事件发生均会发送信号

在pyside中,通过向事件函数传递包含不同信息的事件对象来完成事件的信息传递

事件对象

在QtCore.QEvent中定义了事件对象的基类,所有其他类别的事件对象都是基于该类,该类中定义的方法有

setAccepted(bool)   设置是否继续执行默认程序
accept()            等同于setAccepted(True)
ignore()            等同于setAccepted(False)
isAccepted()        获取是否继续执行默认程序
spontaneous()       该事件是否源自系统事件

在QtGui中基于QtCore.QEvent类拓展了多种事件对象

这些事件对象的类也存在复杂的继承关系以实现更加精细化的功能,这就导致了同一个功能可能有多个事件对象与之对应

如鼠标相关事件对象有QSinglePointEvent以及基于该类拓展的更加精细化的QWheelEvent、QMouseEvent、QHoverEvent等事件对象

事件函数

在QWidget中的各种组件中定义了多种接受一个事件对象的事件函数,用于在组件触发某个事件时自动执行

不同的事件函数可能接受相同的事件对象,如focusInEvent和focusOutEvent事件均接受QFocusEvent

事件函数根据接受到的信息发送对应的信号

在QtWidgets中,所有的组件均继承自QtWidgets.QWidget类,而QtWidgets.QWidget类则继承自QtCore.QObject

QtCore.QObject中的事件函数及信号Signal

常用事件函数

childEvent(QChildEvent)     当子项发生变化时触发
        added()     是否是添加子项
        polished()  是否是子项被重新渲染
        removed()   是否是删除子项
        child()     获取发生改变的子项实例对象

event(event)        任何事件触发时,一般用于拦截指定的事件
        其余未拦截的事件需要继续传播出去,spuer().event(event)

eventFilter(obj, event)  事件拦截
        obj指定要拦截的组件
        event指定要拦截的事件对象
        该函数返回一个bool,True表示拦截,False表示仍然继续执行默认的处理程序

timerEvent(QTimerEvent)  计时器事件
        会定期发送到已启动一个或多个计时器对象,每个计时器都有一个唯一的标识符(int格式)
        timerId()   获取触发计时器事件的计时器标识符
        QObject.startTimer(int)  创建一个间隔int毫秒的计时器,返回一个表示该计时器唯一标识符的int
        QObject.killTimer(id)    取消指定标识符的计时器

常用Signal

destroyed([object=None])    在对象被销毁之前发送,发出此信号后,将立即销毁该对象的所有子项
                            不指定对象则表示使用发送该信号的对象

objectNameChanged(new_name) 在对象名称更改后发送

QtWidgets.QWidget中的事件函数及信号Signal

常用事件函数

closeEvent(QCloseEvent)      收到顶级窗口关闭请求时

enterEvent(QEnterEvent)      鼠标进入事件
leaveEvent(QEvent)           鼠标离开事件
mousePressEvent(QMouseEvent)    鼠标按下
mouseReleaseEvent(QMouseEvent)  鼠标松开
mouseMoveEvent(QMouseEvent)     鼠标移动
mouseDoubleClickEvent(QMouseEvent)  鼠标双击事件,同时接受鼠标按下和松开事件
        事件对象均继承自QSinglePointEvent
        button()          鼠标按键(MouseButton)
        buttons()         鼠标按键的状态(MouseButton)
        globalPosition()  指针相对于屏幕的坐标QPointF
        position()        指针相对于当前组件的坐标QPointF
        modifiers()、setModifiers(modifiers)  获取和设置修饰按键
        timestamp()、setTimestamp(timestamp)  获取和设置时间戳
    

focusInEvent(QFocusEvent)  获得焦点事件
focusOutEvent(QFocusEvent) 失去焦点事件
        gotFocus() 是否获得焦点
        lostFocus()是否失去焦点

hideEvent(QHideEvent)    组件隐藏事件

keyPressEvent(QKeyEvent)   键盘按下事件
keyReleaseEvent(QKeyEvent) 键盘释放事件
        count() 事件中涉及的按键数量
        isAutoRepeat()事件是否由自动重复触发
        key()   按下或释放的int格式键码
        keyCombination()  返回表示按键组合的QKeyCombination对象
            key()  按下或释放的常量Key
            keyboardModifiers() 修饰按键
            toCombined()    按键和修饰按键的值按位或的结果int
        text()  按键的字符串表示

paintEvent(QPaintEvent)  组件重绘事件
        rect()获取需要更新的QRect,region()获取需要更新的QRegion

resizeEvent(QResizeEvent)   组件大小改变
        size()和oldSize()方法返回新旧QSize

showEvent(QShowEvent)  窗口显示

wheelEvent(QWheelEvent)  鼠标滚轮事件
        angleDelta()滚轮自上次事件以来滚动的相对QPoint
            y()返回垂直滚动量,正直表示向上滚动
            x()返回水平滚动量
        inverted()  滚动方向是否反向
        phase()返回事件阶段
            Qt.NoScrollPhase  输入设备不支持滚动阶段
            Qt.ScrollBegin    滚动即将开始,但滚动距离尚未更改
            Qt.ScrollUpdate   滚动距离已更改(默认)
            Qt.ScrollEnd      滚动已结束,滚动距离不再更改
            Qt.ScrollMomentum 用户滚动已结束,但由于滚动动量,滚动会继续
        pixelDelta()屏幕上的滚动距离QPoint

常用Signal

lastWindowClosed()       最后一个顶级窗口关闭时发送
windowIconChanged(QIcon)
windowTitleChanged(title)


网址导航