我想检测在任何QWidget上点击鼠标的时间,所以我试过像这样修补mousePressEvent:
qwidgetmousepressevent = QtWidgets.QWidget.mousePressEvent
def overwriteQWidgetMousePressEvent(self, event):
print("mouse press!")
qwidgetmousepressevent(self, event)
QtWidgets.QWidget.mousePressEvent = overwriteQWidgetMousePressEvent
它本身可以正常工作,但无法触发QPushButton小部件的点击信号。我想我的问题是,有什么可能的原因可以改变程序的行为?据我所知,我保持相同的签名,并调用相同的代码,但有一些东西导致副作用,我无法弄清楚是什么。
答案 0 :(得分:2)
QPushButton
类继承QAbstractButton
,后者继承QWidget
。如果您对QWidget
类进行修补,那么您将覆盖应用程序中每个小部件的mousePressEvent
。这真的是你想要做的吗?
clicked
信号未发出的原因是mousePressEvent
由QAbstractButton
重新实现,但您的代码从未明确调用它。因此,简单的解决方法是对QAbstractButton
或QPushButton
类进行修补,而不是QWidget
。
我不确定为什么覆盖QWidget.mousePressEvent
会绕过PyQt中的子类实现。我猜Python重新实现总是优先于Qt,即使这可能意味着事情似乎被称为“乱序”(就继承的逻辑链而言)。