#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