如何拦截QGraphicsSceneMoveEvent,改变事件位置并调用super().mouseMoveEvent()?

问题描述 投票:0回答:1

我很高兴 QGraphicsItem.ItemIsMovable 可以用鼠标移动 QGraphicsRectItem()。 如果按下控制键,我希望它只垂直移动 = 将鼠标位置 x() 保持为固定值。 为了简单起见,下面的代码没有显示“控制键”的使用

我的思路是继承QGraphicsScene(),重载mouseMoveEvent(),将event.pos().x()改为固定值,用修改后的event调用super()

import sys
from PyQt5.QtWidgets import *

class QGraphicsScene(QGraphicsScene):
    def mouseMoveEvent(self, event):
        newEvent = event
       #newEvent.setPos(  100.0, event.pos().y() ) #### HERE, I need help ! !
        super().mouseMoveEvent(newEvent)

class MainWindow(QWidget):
    def __init__(self ):
        super(QWidget, self).__init__()

        self.scene = QGraphicsScene()
        self.scene.setSceneRect( 0.0, 0.0, 640.0, 480.0 )

        view= QGraphicsView()
        view.setScene(self.scene)
        layout = QVBoxLayout()
        layout.addWidget( view )
        self.setLayout( layout )

        self.myRect= QGraphicsRectItem( 0,  0, 100, 100)
        self.scene.addItem( self.myRect )

        self.myRect.setFlag( QGraphicsItem.ItemIsMovable,      True  )

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

如果我取消注释第 7 行:

    newEvent.setPos(  100.0, event.pos().y() )

我会遇到这个错误:

AttributeError: 'QGraphicsSceneMouseEvent' object has no attribute 'setPos'

我该怎么办? 谢谢。

pyqt qgraphicsscene pyqt6
1个回答
0
投票

项目移动可以通过设置

ItemSendsGeometryChanges
标志并通过实施他们的
itemChange()
并检查类型
ItemPositionChange
的变化来限制,这些变化在before项目被移动:

class VerticallyBlockedRect(QGraphicsRectItem):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setFlag(self.GraphicsItemFlag.ItemSendsGeometryChanges)

    def itemChange(self, change, value):
        if change == self.GraphicsItemChange.ItemPositionChange:
            value.setY(self.y())
        return super().itemChange(change, value)

您显然需要执行上述操作,以便仅在需要时防止移动。

© www.soinside.com 2019 - 2024. All rights reserved.