如何在 PyQt6 中检查 MouseButtonPress 事件?

问题描述

在 PyQt5 中,我们可以使用 QEvent 类验证事件发生,例如 QEvent.MouseButtonPress。在 PyQt6 中,该语句不再有效。我检查了 PyQt6.QtCore.QEventPyQt6.QtGui.QMouseEvent 类的成员,我似乎无法找到包含 MouseButtonPress 事件值的正确 Enum 类。

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: # <-- No longer work in PyQt6
            if event.button() == Qt.RightButton: # <-- 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))

>>>
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','allPointsAccepted','button','buttons','device','deviceType','exclusivePointGrabber','globalPosition','isBeginEvent','isEndEvent','isUpdateEvent','modifiers','point','pointById','pointCount','pointerType','pointingDevice','points','position','scenePosition','setExclusivePointGrabber','timestamp','type']

解决方法

PyQt6 枚举使用 python 枚举的主要变化之一,因此您必须使用枚举名称作为中介,在您的情况下,MouseButtonPress 属于 Type 枚举,RightButton 属于 MouseButtons,因此您必须将其更改为:

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

    return True

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...