我很高兴 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'
我该怎么办? 谢谢。
项目移动可以通过设置
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)
您显然需要执行上述操作,以便仅在需要时防止移动。