PyQt6 中缺少 QEvent.MouseButtonPress 枚举类型?
- 2025-02-11 09:50:00
- admin 原创
- 52
问题描述:
在 PyQt5 中,我们可以使用 QEvent 类(例如 QEvent.MouseButtonPress)验证事件发生。在 PyQt6 中,该语句不再有效。我检查了PyQt6.QtCore.QEvent
和PyQt6.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', '__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:
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
解决方案 2:
import sys
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QWidget
class Widget(QWidget):
def __init__(self):
super().__init__()
def mousePressEvent(self, event):
if event.button() == Qt.MouseButton.LeftButton:
print("left")
print(event.pos().x(), event.pos().y())
elif event.button() == Qt.MouseButton.RightButton:
print("right")
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec())
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD