如何阻止鼠标中键单击取消选择 QGraphicsScene 中的项目而不阻止它从场景中的项目中删除?
How to stop a middle mouse click from deselecting items in a QGraphicsScene without blocking it from items in the scene?
我正在创建一个节点图,我希望能够单击场景中的空白 space 并使用鼠标中键拖动进行导航,而无需取消选择场景中当前选定的项目。有什么建议吗?
我可以阻止视图的 mousePressEvent 中的鼠标中键单击并获得正确的行为,但我不再有鼠标中键单击事件处理场景中的项目。我不介意在场景中单击某个项目时中键单击导致单个选择,但是如果我中键单击场景中的空 space 我不希望更改选择。
这没有涵盖我正在寻找的更复杂的行为:
我没有尝试使用 eventFilter,因为我认为问题是一样的
我正在使用 PyQt/PySide,FWIW。
在我推出自己的解决方法之前,我想我会 post 在这里寻找正确的方法或至少其他解决方法的想法。
一些解决方法:
- 将 mousePressEvent 阻止到场景,但遍历子项以直接传递它
- 在场景中的 mousePressEvent 中恢复选择。可能对大规模性能不利但我想很简单。
任何反馈都很好!
[编辑:]
这是我的 python 版本的答案。代码测试。在我的 QGraphicsScene 派生 class:
def mousePressEvent(self, event):
# Prevent the QGraphicsScene default behavior to deselect-all when clicking on
# empty space by blocking the event in this circumstance.
item_under_the_mouse = self.itemAt(event.scenePos())
if event.button() == QtCore.Qt.MidButton and not item_under_the_mouse:
event.accept()
else:
super(GraphScene, self).mousePressEvent(event)
在您的 QGraphicsScene::mousePressEvent
派生实现中,如果是鼠标中键单击,请检查鼠标单击下的项目。如果没有,则接受事件并且不调用基础 class 实现。如果有东西在点击下,那么就调用基础实现;您不必尝试自己重新实现它。我认为这是总体思路:
void MyScene::mousePressEvent (QGraphicsSceneMouseEvent *evt)
{
if ((evt->buttons () & Qt::MidButton) && items (evt->scenePos ().count ())
{
QGraphicsScene::mousePressEvent (evt);
}
else
{
evt->accept ();
}
}
我不确定在这种情况下是否需要 accept
。我尚未对此进行编译或测试,但希望它能帮助您朝着正确的方向前进。
我正在创建一个节点图,我希望能够单击场景中的空白 space 并使用鼠标中键拖动进行导航,而无需取消选择场景中当前选定的项目。有什么建议吗?
我可以阻止视图的 mousePressEvent 中的鼠标中键单击并获得正确的行为,但我不再有鼠标中键单击事件处理场景中的项目。我不介意在场景中单击某个项目时中键单击导致单个选择,但是如果我中键单击场景中的空 space 我不希望更改选择。
这没有涵盖我正在寻找的更复杂的行为:
我没有尝试使用 eventFilter,因为我认为问题是一样的
我正在使用 PyQt/PySide,FWIW。
在我推出自己的解决方法之前,我想我会 post 在这里寻找正确的方法或至少其他解决方法的想法。
一些解决方法:
- 将 mousePressEvent 阻止到场景,但遍历子项以直接传递它
- 在场景中的 mousePressEvent 中恢复选择。可能对大规模性能不利但我想很简单。
任何反馈都很好!
[编辑:] 这是我的 python 版本的答案。代码测试。在我的 QGraphicsScene 派生 class:
def mousePressEvent(self, event):
# Prevent the QGraphicsScene default behavior to deselect-all when clicking on
# empty space by blocking the event in this circumstance.
item_under_the_mouse = self.itemAt(event.scenePos())
if event.button() == QtCore.Qt.MidButton and not item_under_the_mouse:
event.accept()
else:
super(GraphScene, self).mousePressEvent(event)
在您的 QGraphicsScene::mousePressEvent
派生实现中,如果是鼠标中键单击,请检查鼠标单击下的项目。如果没有,则接受事件并且不调用基础 class 实现。如果有东西在点击下,那么就调用基础实现;您不必尝试自己重新实现它。我认为这是总体思路:
void MyScene::mousePressEvent (QGraphicsSceneMouseEvent *evt)
{
if ((evt->buttons () & Qt::MidButton) && items (evt->scenePos ().count ())
{
QGraphicsScene::mousePressEvent (evt);
}
else
{
evt->accept ();
}
}
我不确定在这种情况下是否需要 accept
。我尚未对此进行编译或测试,但希望它能帮助您朝着正确的方向前进。