猴子修补QWidget mousePressEvent没有触发QPushButton点击

时间:2015-08-26 06:13:40

标签: python pyqt pyqt5 monkeypatching method-overriding

我想检测在任何QWidget上点击鼠标的时间,所以我试过像这样修补mousePressEvent:

qwidgetmousepressevent = QtWidgets.QWidget.mousePressEvent
def overwriteQWidgetMousePressEvent(self, event):
    print("mouse press!")
    qwidgetmousepressevent(self, event)
QtWidgets.QWidget.mousePressEvent = overwriteQWidgetMousePressEvent

它本身可以正常工作,但无法触发QPushButton小部件的点击信号。我想我的问题是,有什么可能的原因可以改变程序的行为?据我所知,我保持相同的签名,并调用相同的代码,但有一些东西导致副作用,我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:2)

QPushButton类继承QAbstractButton,后者继承QWidget。如果您对QWidget类进行修补,那么您将覆盖应用程序中每个小部件的mousePressEvent。这真的是你想要做的吗?

clicked信号未发出的原因是mousePressEventQAbstractButton重新实现,但您的代码从未明确调用它。因此,简单的解决方法是对QAbstractButtonQPushButton类进行修补,而不是QWidget

我不确定为什么覆盖QWidget.mousePressEvent会绕过PyQt中的子类实现。我猜Python重新实现总是优先于Qt,即使这可能意味着事情似乎被称为“乱序”(就继承的逻辑链而言)。