PyQt5: переключение с mousePressEvent на mouseReleaseEvent вызывает сбой программы - PullRequest
0 голосов
/ 29 марта 2020

Я разрабатываю программу в Python 3.7 с PyQt5, которая реализует пользовательское окно уведомлений. Для этого я создал класс Notification, показывающий окно, которое:

  • открывает ссылку в браузере и закрывается при щелчке левой кнопкой мыши
  • просто закрывается при щелчке правой кнопкой мыши

Я начал с использования mousePressEvent для обнаружения кликов (точно такой же код, как показано ниже, просто заменив mouseReleaseEvent на mousePressEvent), и все работало нормально. Однако после переключения на mouseReleaseEvent (поскольку в противном случае пользователь также щелкнул бы все, что находилось за окном уведомлений), программа аварийно завершает работу при щелчке правой кнопкой мыши по окну уведомлений без каких-либо исключений. Код выхода - 3221225477.

При щелчке левой кнопкой мыши по окну проблем не возникает. Похоже, что проблема вызвана вызовом self.notifier.update, поскольку его устранение решает проблему, но я не знаю, почему или почему поведение изменилось бы при простой модификации события.

Упрощенная версия моего кода ниже.

class Notifier():
    ''' Manages the active notification and the notification queue.'''
    def __init__(self):
        self.activeNotification = None
        self.queue = []

    def update(self):
        '''Call after killing the active notification. Processes the queue.'''
        if self.queue == []:
            self.activeNotification = None
        else:
            self.activeNotification = self.queue.pop(0)
            self.activeNotification.show()

class Notification(QMainWindow):
        def __init__(self, notifier, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.notifier = notifier

        def mouseReleaseEvent(self, QMouseEvent):
            if QMouseEvent.button() == Qt.LeftButton:
                self.close()
                webbrowser.open_new_tab(self.link)
            elif QMouseEvent.button() == Qt.RightButton:
                self.close()

        def close(self):
            '''Updates notifier and closes window'''
            super().close()
            self.notifier.update()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...