Как проверить событие MouseButtonPress в PyQt6?

#python #pyqt6

Вопрос:

В PyQt5 мы можем проверить возникновение события с помощью класса QEvent, например QEvent.Нажатие кнопки мыши. В PyQt6 это утверждение больше не действует. Я проверил членов обоих PyQt6.QtCore.QEvent PyQt6.QtGui.QMouseEvent классов и, похоже, я не могу найти правильный класс перечисления, содержащий значение события MouseButtonPress.

Пример PyQt5 Я пытаюсь перевести на PyQt6

 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import QEvent, Qt  class AppDemo(QWidget):  def __init__(self):  super().__init__()  self.resize(800, 400)  self.installEventFilter(self)    def eventFilter(self, QObject, event):  if event.type() == QEvent.MouseButtonPress: # lt;-- No longer work in PyQt6  if event.button() == Qt.RightButton: # lt;-- Becomes event.button() == Qt.MouseButtons.RightButton  print('Right button clicked')    return True  if __name__ == '__main__':  app = QApplication(sys.argv)   demo = AppDemo()  demo.show()   try:  sys.exit(app.exec_())  except SystemExit:  print('Closing Window...')  

Обновленный: Если я распечатаю элементы как QEvent, так и QMouseEvent, это все доступные элементы.

 print('Members of PyQt6.QtCore.QEvent') print(dir(QEvent)) print('-'*50) print('Members of PyQt6.QtCore.QMouseEvent') print(dir(QMouseEvent))  gt;gt;gt; Members of PyQt6.QtCore.QEvent ['Type', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'accept', 'clone', 'ignore', 'isAccepted', 'isInputEvent', 'isPointerEvent', 'isSinglePointEvent', 'registerEventType', 'setAccepted', 'spontaneous', 'type'] -------------------------------------------------- Members of PyQt6.QtCore.QMouseEvent ['Type', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'accept', 'allPointsAccepted', 'button', 'buttons', 'clone', 'device', 'deviceType', 'exclusivePointGrabber', 'globalPosition', 'ignore', 'isAccepted', 'isBeginEvent', 'isEndEvent', 'isInputEvent', 'isPointerEvent', 'isSinglePointEvent', 'isUpdateEvent', 'modifiers', 'point', 'pointById', 'pointCount', 'pointerType', 'pointingDevice', 'points', 'position', 'registerEventType', 'scenePosition', 'setAccepted', 'setExclusivePointGrabber', 'spontaneous', 'timestamp', 'type']  

Комментарии:

1. Если я распечатаю членов QEvent, это все доступно. «принять», «клонировать», «игнорировать», «Принято», «isInputEvent», «isPointerEvent», «isSinglePointEvent» PS: Добавлена дополнительная информация в сообщении.

2. О, не могу поверить, что я скучаю по этому. Огромное спасибо.

Ответ №1:

Одно из основных изменений, в котором перечисления PyQt6 используют перечисления python, поэтому вы должны использовать имя перечисления в качестве посредника, в вашем случае MouseButtonPress относится к типу перечисления, а RightButton-к кнопкам мыши, поэтому вы должны изменить его на:

 def eventFilter(self, QObject, event):  if event.type() == QEvent.Type.MouseButtonPress:  if event.button() == Qt.MouseButtons.RightButton:  print("Right button clicked")   return True