【PyQt】事件机制

2019-05-27  本文已影响0人  4thirteen2one

信号与槽机制是对事件机制的高级封装
事件机制更偏向于底层

每个 Qt 应用程序对应一个 QAppliation 对象
一个应用程序拥有几个消息队列,应用程序的消息循环,就是在处理这些队列中的消息

用户的操作会产生各种事件消息
消息首先会被操作系统接收,然后操作系统会把消息分发到对应的各应用程序的“消息队列”中

比如分为两个队列:系统产生的消息组成的队列(鼠标事件、键盘事件、拖放事件),程序内部产生的消息组成的队列(定时器事件、绘屏事件)

消息循环:
不断地按顺序检测消息队列中是否有消息
若发现“事件消息”,则包装成“QEvent 对象”进行分发处理

将事件接收者(receiver)和事件对象(evt)传递给 QApplication 对象的 notify(receiver, evt) 方法进行处理

QApplication 对象是否安装事件过滤器(事件过滤器可设置多个,但会按照设置的逆序进行分发)

import sys
form PyQt5.Qt import *
# 通过继承重写方法
class App(QApplication):
    def notify(self, recv, evt):
        if recv.inherits("QPushButton") and evt.type() == QEvent.MouseButtonPress:
            print(recv, evt)
        return super().notify(recv, evt)

class Btn(QPushButton):
    def event(self, evt):
        if evt.type() == QEvent.MouseButtonPress:
            print("按钮被点击咯", evt)
        return super().event(evt)

    def mousePressEvent(self, *args, **kwargs):
        print("鼠标被按下了")
        return super().mousePressEvent(*args, **kwargs)

app = App(sys.argv)

window = QWidget()

btn = Btn(window)
btn.setText("按钮")

def slot():
    print("按钮被点击了")

btn.pressed.connect(slot)

window.show()

sys.exit(app.exec_())
上一篇 下一篇

猜你喜欢

热点阅读