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

分类: 计算机技术
推荐阅读:
什么是控制字符? 控制字符是ASCII码表中的一部分字符,其编码在0到31之间(包括0和31),以及字符127;这些字符通常不用于显示文本,而是用于控制计算机的输入输出,或者用于传输数据时控制信息;
Python join()方法 在使用Python处理字符串时,您可能需要将较小的块连接在一起形成一个字符串;Python中的字符串方法join()可以帮助您完成这个任务;
Python实现二分法检索(binary search) 二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中。
Python round()函数 在 Python 中,round() 函数用于将一个浮点数四舍五入到指定的小数位数。它可以接受两个参数:要四舍五入的浮点数和指定的小数位数(默认为 0)。
PySide6使用Qt Designer创建的UI 在本文中,你将学会使用Qt Designer画出UI,并在Python中使用它;
PySide6 QKeyEvent:键盘事件类 QKeyEvent是PySide6中用于表示键盘事件的类,用于处理与键盘相关的用户输入事件,如按键、释放等;