所以这是我的问题。我有一个带有多个 QGraphicsItem 的 QGraphicsScene ,它们都具有标志 QtWidgets.QGraphicsItem.ItemIsMovable 。移动它们的效果很好,除非发生某些动作会中断( QGraphicsItem )MouseEvent,例如,从场景中删除/删除该项目,同时拖动该项目。下一个单击/移动的项目的位置变为偏移,使其看起来就像刚刚被传送一样。在调用MouseMoveEvent之后立即发生。在移除项目的情况下,它会跳到场景中的0,0位置。导致项目偏移的操作的另一个示例是,用鼠标右键打开上下文菜单,同时仍然用鼠标左键拖动它。我认为这是同一个问题,尽管在这种情况下,它似乎仅在打开上下文菜单时被鼠标移动的距离抵消了。
这是一个与我的项目相似的示例。要重现该错误,请按照下列步骤操作:
步骤1-首先移动两个节点
第2步-开始移动节点,但在释放鼠标按钮之前将其删除
第3步-拖动其余节点,您将看到它变为偏移量
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import random
class CustomScene (QtWidgets.QGraphicsScene):
def __init__(self, x, y, width, height):
super().__init__( x, y, width, height)
self.width = width
self.height = height
self.addNode()
self.addNode()
def addNode (self):
node = QtWidgets.QGraphicsRectItem(random.random() * self.width,random.random() * self.height,100,100)
node.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
node.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
node.setZValue(10)
node.setBrush(QtCore.Qt.red)
self.addItem(node)
class NodeWindow (QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.centralWidget = QtWidgets.QWidget(self)
self.setMinimumSize(1000, 500)
self.scene = CustomScene(0, 0, 700, 400)
self.view = QtWidgets.QGraphicsView(self.centralWidget)
self.view.setScene(self.scene)
self.setCentralWidget(self.centralWidget)
self.show()
def keyPressEvent (self, event):
if event.key() == QtCore.Qt.Key_Delete:
for node in self.scene.selectedItems():
self.scene.removeItem(node)