Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何阻止鼠标中键单击取消选择QGraphicscene中的项目,而不阻止它与场景中的项目?_Qt_Pyqt_Selection_Qgraphicsscene_Qgraphicsitem - Fatal编程技术网

Qt 如何阻止鼠标中键单击取消选择QGraphicscene中的项目,而不阻止它与场景中的项目?

Qt 如何阻止鼠标中键单击取消选择QGraphicscene中的项目,而不阻止它与场景中的项目?,qt,pyqt,selection,qgraphicsscene,qgraphicsitem,Qt,Pyqt,Selection,Qgraphicsscene,Qgraphicsitem,我正在创建一个节点图,我希望能够单击场景中的空白区域并拖动鼠标中键进行导航,而无需取消选择场景中当前选定的项目。有什么建议吗 我可以在视图的mousePressEvent中阻止鼠标中键单击并获得正确的行为,但这样我就不再在场景中的项目上使用鼠标中键单击事件。我不介意在单击场景中的某个项目时,中键单击会导致单个选择,但是如果我在场景中的空白区域中单击鼠标中键,我不希望更改选择 这并没有涵盖我正在寻找的更复杂的行为: 我没有尝试使用eventFilter,因为我认为问题是相同的 我正在使用PyQt/

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

我可以在视图的mousePressEvent中阻止鼠标中键单击并获得正确的行为,但这样我就不再在场景中的项目上使用鼠标中键单击事件。我不介意在单击场景中的某个项目时,中键单击会导致单个选择,但是如果我在场景中的空白区域中单击鼠标中键,我不希望更改选择

这并没有涵盖我正在寻找的更复杂的行为:

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

我正在使用PyQt/PySide,FWIW

在我推出自己的解决方案之前,我想我应该在这里发布正确的方法或至少其他解决方案的想法

一些变通方法:

  • 将mousePressEvent阻止到场景,但迭代子项以直接传递它
  • 仍在场景中的mousePressEvent中时恢复选择。在规模上可能对性能不利,但我认为很简单
任何反馈都会很好

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

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)

qgraphicscene::mousePressEvent
派生的实现中,如果是鼠标中键单击,请检查鼠标单击下的项目。如果没有,则接受事件,不调用基类实现。如果单击下有内容,则只需调用基本实现;你不必自己去尝试重新实现它。我认为这是总的想法:

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

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

这就是我的方向。很高兴看到确认。一旦python版本开始工作,我会发布它。非常好……我不懂python,但我发现在答案中来回转换非常容易。