Python QGraphicscene在空选择框上保留选择
我在Python QGraphicscene在空选择框上保留选择,python,selection,pyside,qgraphicsview,Python,Selection,Pyside,Qgraphicsview,我在qgraphicscene中收集了QGraphicsItem。我试图获得按住ctrl键并取消选择选择框中的任何项目的行为。问题是当前选择将在鼠标按下时清除。我有没有遗漏什么来阻止这一切 我唯一能想到的是在鼠标释放时保存当前选择,然后在下一次鼠标按下事件时恢复它。这看起来不是很优雅,所以我希望避免这种情况。这给了我想要的行为。我知道这不是最有效的方法,所以请让我知道这是否还可以改进 # Override double click event so it doesn't clear select
qgraphicscene
中收集了QGraphicsItem
。我试图获得按住ctrl
键并取消选择选择框中的任何项目的行为。问题是当前选择将在鼠标按下时清除。我有没有遗漏什么来阻止这一切
我唯一能想到的是在鼠标释放时保存当前选择,然后在下一次鼠标按下事件时恢复它。这看起来不是很优雅,所以我希望避免这种情况。这给了我想要的行为。我知道这不是最有效的方法,所以请让我知道这是否还可以改进
# Override double click event so it doesn't clear selection
def mouseDoubleClickEvent(self, event):
pass
def mousePressEvent(self, event):
QtGui.QGraphicsView.mousePressEvent(self, event)
# Save state of mouse button and any key modifiers
self.mouseButton = event.button()
self.modifiers = event.modifiers()
# If a modifier key is held, don't clear the selection!
if self.modifiers == QtCore.Qt.SHIFT or self.modifiers == QtCore.Qt.CTRL:
if self.lastSelection:
for item in self.lastSelection:
item.setSelected(True)
else:
self.scene().clearSelection()
def mouseMoveEvent(self, event):
QtGui.QGraphicsView.mouseMoveEvent(self, event)
# Only apply if the left mouse button is being held down
if self.mouseButton == QtCore.Qt.MouseButton.LeftButton:
# Add items to current selection if shift is held down
if self.modifiers == QtCore.Qt.SHIFT:
sel = set( self.lastSelection ).union( set( self.scene().selectedItems() ) )
for item in sel:
item.setSelected(True)
# Remove items from current selection if ctrl is held down
elif self.modifiers == QtCore.Qt.CTRL:
sel = set( self.lastSelection ).union( set( self.scene().selectedItems() ) )
dif = set( self.lastSelection ).symmetric_difference( set( self.scene().selectedItems() ) )
for item in sel:
selectState = not (item not in self.lastSelection or item not in dif)
item.setSelected(selectState)
def mouseReleaseEvent(self, event):
QtGui.QGraphicsView.mouseReleaseEvent(self, event)
# Reset values
self.mouseButton = None
self.modifiers = None
self.lastSelection = self.scene().selectedItems() # Store last selected items
因此,现在如果我按住ctrl
,它将取消选择项目,按住shift
将添加到选择中,正常的鼠标单击将按预期清除选择
唯一需要添加的是将
shift
和ctrl
添加到一次鼠标单击中,但由于按住ctrl
确实可以添加和删除,因此现在就足够了。似乎在鼠标移动过程中选择也会被清除,因此这可能是一个问题!找到有关此问题的详细信息: