单击 QFrame 时触发函数
Trigger a function on clicking QFrame
我正在使用 PyQt5 开发一个项目,其中有 QFrames
。我正在使用鼠标按下事件来触发单击框架的功能,如下所示:
frame.mousePressEvent = lambda x: print_name(x, name)
上面一行不会在开始时执行,它会在用户在 UI 中完成一些工作后执行。
我得到了我想要的行为,但问题是:
如果用户在执行上述代码行后单击框架,它工作正常,但如果用户在执行上述行代码之前单击框架,然后再次单击框架(在代码被执行后)执行),我没有得到相同的行为。基本上什么都没发生。
我想知道问题出在哪里,如何解决?
问题是因为PyQt5缓存了方法,所以如果分配了方法就不能改变。除了遵循将方法分配给 mousePressEvent 的不良做法之外,还有其他更好的选择,例如:
实现继承
class Frame(QFrame):
def mousePressEvent(self, event):
super().mousePressEvent(event)
print(event)
使用事件过滤器
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)
第二种似乎最适合你的情况。
我正在使用 PyQt5 开发一个项目,其中有 QFrames
。我正在使用鼠标按下事件来触发单击框架的功能,如下所示:
frame.mousePressEvent = lambda x: print_name(x, name)
上面一行不会在开始时执行,它会在用户在 UI 中完成一些工作后执行。
我得到了我想要的行为,但问题是:
如果用户在执行上述代码行后单击框架,它工作正常,但如果用户在执行上述行代码之前单击框架,然后再次单击框架(在代码被执行后)执行),我没有得到相同的行为。基本上什么都没发生。
我想知道问题出在哪里,如何解决?
问题是因为PyQt5缓存了方法,所以如果分配了方法就不能改变。除了遵循将方法分配给 mousePressEvent 的不良做法之外,还有其他更好的选择,例如:
实现继承
class Frame(QFrame): def mousePressEvent(self, event): super().mousePressEvent(event) print(event)
使用事件过滤器
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)
第二种似乎最适合你的情况。