You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:06