猴子修补 QWidget mousePressEvent 不触发 QPushButton 单击

Monkey patching QWidget mousePressEvent not triggering QPushButton click

我想检测何时在任何 QWidget 上进行了鼠标点击,所以我尝试像这样猴子修补 mousePressEvent:

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

它自己可以正常工作,但无法触发 QPushButton 小部件的点击信号。我想我的问题是,程序行为发生任何变化的可能原因是什么?据我所知,我保留了相同的签名并调用了相同的代码,但是有一些东西导致了副作用,我不知道是什么。

QPushButtonclass继承QAbstractButton,进而继承QWidget。如果您对 QWidget class 进行猴子修补,您将覆盖应用程序中每个小部件的 mousePressEvent。这真的是你想要做的吗?

clicked 信号未发出的原因是因为 mousePressEventQAbstractButton 重新实现,但您的代码从未显式调用它。所以简单的解决方法是猴子修补 QAbstractButtonQPushButton class 而不是 QWidget.

我不确定为什么覆盖 QWidget.mousePressEvent 会绕过 PyQt 中的 subclass 实现。我猜 Python 重新实现总是优先于 Qt 的,即使这可能意味着事情似乎被调用 "out of order" (就继承的逻辑链而言)。