0

我正在使用 PyQt5 开发一个项目,该项目具有QFrames. 我正在使用鼠标按下事件来触发点击框架上的功能,如下所示:

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

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

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

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

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

4

1 回答 1

1

这个问题是因为 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)
    

第二个似乎最适合您的情况。

于 2021-10-19T16:27:42.480 回答