2015-08-26 7 views
0

Я хотел бы, чтобы обнаружить, когда мыши были сделаны на любой QWidget и поэтому я попытался обезьяну Патченье mousePressEvent так:обезьяна латание QWidget mousePressEvent не вызывает QPushButton нажмите

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

который работает отлично на он собственный, но не может вызвать щелчок сигнала виджета QPushButton. Я предполагаю, что мой вопрос в том, каковы возможные причины для изменения поведения в программе? Насколько я могу судить, я сохраняю одну и ту же подпись и называю тот же код, но есть что-то, что вызывает побочный эффект, и я не могу понять, что.

+0

Предоставленный код не упоминает кнопку ... вы забыли что-то включить? –

ответ

2

Класс наследует QAbstractButton, который, в свою очередь, наследует QWidget. Если вы обезвреживаете класс QWidget, вы переопределяете mousePressEvent для каждого виджета в вашем приложении. Это действительно то, что вы хотите сделать?

Причина, по которой сигнал clicked не испускается, потому что mousePressEvent переопределяется QAbstractButton, но ваш код никогда не называет его явно. Таким образом, простым решением является обезьяна-патч QAbstractButton или QPushButton вместо QWidget.

Я не знаю точно, почему переопределение QWidget.mousePressEvent обходит реализации подкласса в PyQt. Я предполагаю, что переименование Python всегда будет иметь приоритет над Qt-элементами, хотя это может означать, что вещи, похоже, называются «не в порядке» (в терминах логической цепочки наследования, то есть).

+0

Спасибо, исправление QAbstractButton выполняет эту работу. Я все еще смущен, почему переопределения QWidget было недостаточно, но на данный момент он будет восприниматься как реальность жизни: -/ – nqe

+0

@nqe. Я думал, что объяснил это довольно четко. Исходный патч не вызывает 'QAbstractButton.mousePressEvent' (который отвечает за выдачу сигнала' clicked') - все, что он делает, это вызов 'QWidget.mousePressEvent', который фактически ничего не делает. – ekhumoro

+0

Справа. Что меня смущает, почему переопределение 'QWidget.mousePressEvent' нарушит поведение' QAbstractButton.mousePressEvent'? Как вы говорите, последнее не называется первым, так почему здесь причина и следствие? На самом деле в коде выше, когда я нажимаю на 'QPushButton', я получаю два« нажатия мыши »! сообщения, один для кнопки и один для родительского виджета, но я вижу, что в [реализации C++] (https://github.com/qtproject/qtbase/blob/dev/src/widgets/widgets/qabstractbutton.cpp # L1092) родитель никогда не называется, что меня тоже пугает. – nqe

 Смежные вопросы

  • Нет связанных вопросов^_^