Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 9, 2010 17:03:27

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

Приложение должно закрываться по клику правой кнопки. Мой обработчик:

    def mousePressEvent(self, event):
if event.buttons() == QtCore.Qt.RightButton:
exit()
Но получается так, что то, что находилось под моим окном, тоже получает правый клик, вываливая контекстное меню. Как бы сообщить, что клик обработан и его надо дропнуть с закрытием приложения? Я пробовал event присваивать None, но эффекта от этого никакого. Как бы это дело забороть?



Офлайн

#2 Июнь 9, 2010 17:38:14

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

Думаю стоит посмотреть вот на этот момент из доков
A mouse event contains a special accept flag that indicates whether the receiver wants the event. You should call ignore() if the mouse event is not handled by your widget. A mouse event is propagated up the parent widget chain until a widget accepts it with accept(), or an event filter consumes it.
Если коротко, то вызывай event.accept() и будет тебе счастье:) сам не проверял



Офлайн

#3 Июнь 10, 2010 00:23:41

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

по-моему, как раз наоборот, нужно выполнить то что нужно, а дальше event.ignore()

    def mousePressEvent(self, event):
if event.buttons() == QtCore.Qt.RightButton:
exit()
event.ignore()
хотя, я тоже сам не проверял :) но решение точно где-то здесь



Офлайн

#4 Июнь 10, 2010 08:16:45

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

Так вроде ignore() - значит не обрабатывать событие, а передать его родительскому классу. Я же выше цитировал доки там английским языком написано, что событие будет передаваться родительскому классу, пока оно не будет принято (accept) или отброшено фильтром.



Офлайн

#5 Июнь 10, 2010 10:46:40

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

Да чего-то accept не помогает вообще никак. Может, у меня с “главным” окном что-нибудь… Пока копаю в этом направлении. Но применение WA_MousePropagation и WA_NoMousePropagation тоже результатов не приносят.

В доке есть “A mouse event is propagated up the parent widget chain until a widget accepts it with accept(), or an event filter consumes it.” По ходу, где-то должен быть фильтр. Или accept надо вызывать не из события. В общем, идеи есть, но если вы знаете, как правильно, - не стесняйтесь продолжать ветку.



Офлайн

#6 Июнь 10, 2010 12:49:29

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

Я, вроде, догадался что происходит: по MOUSE_DOWN моё приложение закрывается. Но то, что под ним, получает MOUSE_UP при отпускании кнопки. Отсюда и контекстное меню.

Но что-то не могу найти, а как написать реакцию на отпускание мыши? mouseReleaseEvent по аналогии с mousePressEvent чего-то нету. Может, надо “вручную” сигнал к слоту прикручивать? К какому тогда слоту? И какие параметры должны быть у сигнала? Чего-то я не догоняю в терминах PyQt, в терминах winAPI: как мне привязать мою процедуру к сообщению WM_MOUSE_UP?



Офлайн

#7 Июнь 11, 2010 06:43:55

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT. Клик мыши передаётся вниз.

Подождите. Как это mouseReleaseEvent нету? А что же я тогда наблюдаю сейчас у себя в соседнем окне? :) (доки открыты на странице с mousePressEvent и mouseReleaseEvent):)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version