PySide2在eventFilter中识别控件对象名称的实现方法咨询
PySide2判断事件触发控件的两种实现方法
- 方法1:直接比对控件对象
你当前的实现逻辑是可行的,由于QPlainTextEdit属于滚动区类部件,你给它的viewport(文本绘制视口子部件)安装了事件过滤器,因此触发事件的obj是视口对象,直接和你存储的视口对象比对,或者通过obj.parent()拿到对应的QPlainTextEdit实例和控件变量比对均可。 - 方法2:通过
objectName判断
如果项目中控件数量较多,逐个比对对象的写法扩展性较差,可以给每个控件设置唯一的objectName属性,触发事件时直接获取名称即可做分支逻辑,无需提前存储所有控件变量。
完整优化代码
#!/usr/bin/python from PySide2.QtCore import Qt, QEvent import sys from PySide2.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QPlainTextEdit, QWidget) class Window(QMainWindow): def __init__(self, app): super().__init__() def create_widget(self): self.plain_textedit = QPlainTextEdit() self.plain_textedit.setMouseTracking(True) # 给控件设置唯一objectName self.plain_textedit.setObjectName("plain_1") self.plain_textedit.viewport().installEventFilter(self) self.another_textedit = QPlainTextEdit() self.another_textedit.setMouseTracking(True) self.another_textedit.setObjectName("plain_2") self.another_textedit.viewport().installEventFilter(self) main_layout = QVBoxLayout() main_layout.addWidget(self.plain_textedit) main_layout.addWidget(self.another_textedit) self.window = QWidget() self.window.setLayout(main_layout) self.setCentralWidget(self.window) def eventFilter(self, obj, event): # 仅示例处理鼠标按下事件,可按需修改要拦截的事件类型 if event.type() == QEvent.MouseButtonPress: # 方法1:对象比对实现 if obj is self.plain_textedit.viewport(): print("对象比对结果:当前操作的是plain_1") elif obj is self.another_textedit.viewport(): print("对象比对结果:当前操作的是plain_2") # 方法2:objectName实现 parent_widget = obj.parent() if isinstance(parent_widget, QPlainTextEdit): widget_name = parent_widget.objectName() print(f"objectName获取结果:当前操作的控件名称是{widget_name}") # 直接根据名称走对应逻辑即可 # if widget_name == "plain_1": # 执行plain_1的业务逻辑 # elif widget_name == "plain_2": # 执行plain_2的业务逻辑 # 不要忘记返回父类的事件过滤结果,否则会拦截正常事件传递 return super().eventFilter(obj, event) def main(): app = QApplication([]) window = Window(app) window.create_widget() window.show() app.exec_() if __name__ == "__main__": sys.exit(main())
内容的提问来源于stack exchange,提问作者user765443
相关产品推荐
相关产品推荐

