如何停止鼠标中键以取消选择QGraphicsScene中的项目而不将其阻挡在场景中的项目中?

时间:2017-03-06 22:00:12

标签: qt pyqt selection qgraphicsscene qgraphicsitem

我正在创建节点图,我希望能够单击场景中的空白区域并鼠标拖动进行导航,而无需取消选择场景中当前选定的项目。有什么建议吗?

我可以在视图的mousePressEvent中阻止中间点击并获得正确的行为,但之后我不再有中等鼠标点击事件处理场景中的项目。我不介意在点击场景中的项目时进行单击选择,但是如果我中间点击场景中的空白区域,我不希望选择更改。

这并没有涵盖我正在寻找的更复杂的行为:PyQt. How to block clear selection on mouse right click?

我没有尝试使用eventFilter,因为我认为问题是相同的

我正在使用PyQt / PySide,FWIW。

在我推出自己的解决方法之前,我认为我会在这里发布正确的方法或至少其他解决方法。

一些解决方法的想法:

  • 将mousePressEvent阻止到场景但迭代子项以直接传递
  • 在场景中的mousePressEvent中恢复选择。对于大规模的性能可能不好,但我认为很简单。

任何反馈都会很棒!

[编辑:] 这是我的答案的python版本。代码测试。在我的QGraphicsScene派生类中:

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)

1 个答案:

答案 0 :(得分:1)

QGraphicsScene::mousePressEvent派生的实现中,如果是鼠标中键,请在鼠标单击下检查项目。如果没有,则接受该事件,不要调用基类实现。如果点击下有什么内容,那么只需调用基础实现;你不必试图重新实现自己。我认为这是一般的想法:

void MyScene::mousePressEvent (QGraphicsSceneMouseEvent *evt)
{
    if ((evt->buttons () & Qt::MidButton) && items (evt->scenePos ().count ())
    {
        QGraphicsScene::mousePressEvent (evt);
    }
    else
    {
        evt->accept ();
    }
}

我不确定在这种情况下是否需要accept。我没有编译或测试过这个,但希望能帮助你朝着正确的方向前进。