PySide6 事件的传播机制

在PySide6中,界面上的按钮(QPushButton)和QWidget部件都可以定义keyPressEvent来处理键盘按键事件。当按键事件发生时,系统会根据事件的传播机制来确定哪个部件的keyPressEvent方法将被执行。

事件的传播是从父部件向子部件传递的,意味着如果一个子部件没有处理事件,那么它的父部件可能会处理它。事件的传播遵循以下顺序:

  • 首先,系统会检查具有焦点的部件是否定义了与事件相应的方法(例如keyPressEvent)。
  • 如果有焦点的部件没有处理事件,系统会将事件传递给它的父部件,以查看父部件是否处理事件。
  • 这个过程会一直向上追溯,直到找到一个处理事件的部件,或者到达顶级窗口。

基于这个传播机制,当界面上有一个按钮(QPushButton)和QWidget部件都定义了keyPressEvent方法时,事件的处理顺序将取决于当前有焦点的部件。如果焦点在按钮上,那么按钮的keyPressEvent方法将被执行;如果焦点在QWidget部件上,那么QWidget的keyPressEvent方法将被执行。

示例代码

import sys
from PySide6.QtWidgets import (QApplication, QWidget, QStyleFactory,
        QPushButton, QVBoxLayout)
from PySide6.QtGui import QKeyEvent

class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(300, 200)
        self.setWindowTitle("事件传播机制")

        self.button1 = QPushButton("Button 1")
        self.button2 = QPushButton("Button 2")
        self.button1.keyPressEvent = self.on_button1_keyPressEvent
        layout = QVBoxLayout()
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        self.setLayout(layout)

    def on_button1_keyPressEvent(self,event:QKeyEvent):
        print("Button 1:",event.text())
    def keyPressEvent(self,event:QKeyEvent):
        print("QWidget:",event.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create("Fusion"))
    window = MainWidget()
    window.show()
    sys.exit(app.exec())

这段代码中,定义了两个Button,其中 Button1 实现了keyPressEvent方法,Button2 则无;QWidget 部件定义了keyPressEvent方法;

当程序执行时,如果焦点在 Button1 上,按下按键时,Button1 的keyPressEvent方法将被执行;当焦点在 Button2 上,按下按键时,由于 Button2 没有定义keyPressEvent方法,所以由它的父部件,也就是 QWidget 来处理该事件;

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/pyside6-events/propagation-mechanism.html

分类: 计算机技术
推荐阅读:
使用Rust实现CRC32算法 CRC32是一种循环冗余校验码(Cyclic Redundancy Check)算法,通常用于数据传输或存储中的错误检测。该算法通过对输入数据进行位操作和模2除法来生成一个32位的校验码,该校验码可以用于验证输入数据是否已经损坏或被篡改。
Python slice()函数 在 Python 中,slice() 函数用于创建一个 slice 对象,该对象可以用于对序列进行切片操作。slice() 函数接受三个参数:起始位置、结束位置和步长。这些参数都是可选的。
Linux终端如何输入复杂的命令 在Linux下,当你要输入的命令过于复杂,比如有许多参数,你可以先按 ctrl + x ,再按 ctrl + e 快速打开一个编辑器编辑命令。
Python len()函数 在Python中,len()函数用于返回一个对象的长度(元素个数)。这个对象可以是序列类型(如字符串、列表、元组、字节序列等),也可以是映射类型(如字典)。
C语言strncpy()函数:复制字符串中的n个字符 strncpy()是C语言标准库中的一个字符串复制函数,用于将一个字符串的n个字符复制到另一个字符串中;
从Nginx日志中提取UserAgent、IP等信息 有时我们需要用到大量UserAgent信息,而Nginx日志文件中包含了海量真实的UserAgent,从Nginx文件中提取所有UserAgent信息就很有必要;