单击 QFrame 时触发函数

Trigger a function on clicking QFrame

我正在使用 PyQt5 开发一个项目,其中有 QFrames。我正在使用鼠标按下事件来触发单击框架的功能,如下所示:

frame.mousePressEvent = lambda x: print_name(x, name)

上面一行不会在开始时执行,它会在用户在 UI 中完成一些工作后执行。

我得到了我想要的行为,但问题是:

如果用户在执行上述代码行后单击框架,它工作正常,但如果用户在执行上述行代码之前单击框架,然后再次单击框架(在代码被执行后)执行),我没有得到相同的行为。基本上什么都没发生。

我想知道问题出在哪里,如何解决?

问题是因为PyQt5缓存了方法,所以如果分配了方法就不能改变。除了遵循将方法分配给 mousePressEvent 的不良做法之外,还有其他更好的选择,例如:

  1. 实现继承

    class Frame(QFrame):
        def mousePressEvent(self, event):
            super().mousePressEvent(event)
            print(event)
    
  2. 使用事件过滤器

    class MouseObserver(QObject):
        def __init__(self, widget):
            super().__init__(widget)
            self._widget = widget
            self.widget.installEventFilter(self)
    
        @property
        def widget(self):
            return self._widget
    
        def eventFilter(self, obj, event):
            if obj is self.widget and event.type() == QEvent.MouseButtonPress:
                print(event)
            return super().eventFilter(obj, event)
    

    然后

    observer = MouseObserver(frame)
    

第二种似乎最适合你的情况。