Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
C++ 如何禁用qgraphicsitem的多选功能?_C++_Qt_Qgraphicsitem - Fatal编程技术网

C++ 如何禁用qgraphicsitem的多选功能?

C++ 如何禁用qgraphicsitem的多选功能?,c++,qt,qgraphicsitem,C++,Qt,Qgraphicsitem,我是新来的。似乎多次选择qgraphicsitem的默认设置是按ctrl键。 但是否可以禁用此功能?或者重新加载此功能?这由项目的标志控制。要禁用对特定项目的选择,请执行以下操作: item->setFlag(QGraphicsItem::ItemIsSelectable, false); 如果要完全禁用为qgraphicscene选择项目,而不考虑项目标志,我建议将qgraphicscene::selection更改为qgraphicscene::clearSelection 如果要禁

我是新来的。似乎多次选择qgraphicsitem的默认设置是按ctrl键。
但是否可以禁用此功能?或者重新加载此功能?

这由项目的标志控制。要禁用对特定项目的选择,请执行以下操作:

item->setFlag(QGraphicsItem::ItemIsSelectable, false);
如果要完全禁用为
qgraphicscene
选择项目,而不考虑项目标志,我建议将
qgraphicscene::selection更改为
qgraphicscene::clearSelection

如果要禁用多重选择,我建议如下:

  • 子类qgraphicscene并将指针
    lastSelection
    保留在QGraphicsSitem周围
  • 创建一个连接到
    qgraphicscene::selectionChanged
  • 选中
    selectedItems
    • 它是空的:无事可做(=未选择任何内容)
    • 仅包含
      lastSelection
      :无需执行(=选择未真正更改)
    • 包含一个项目,而不是
      lastSelection
      :将
      lastSelection
      设置为该项目(=第一次选择的一个项目)
    • 包含两项:一项必须是
      lastSelection
      。从选择中删除该项(
      lastSelection->setSelected(false);
      ),将
      lastSelection
      设置为剩余项。(=已选择另一项,请将所选内容移动到该项)

在修改插槽内的选择时,您可能需要阻止信号。

禁用多个选择的简单方法是:

  • QGraphicsItem
    创建您自己的驱动类
  • 过载受保护的
    mousePressEvent
    功能并禁用
    ControlModifier

    protected:
        void YourOwnQGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) Q_DECL_OVERRIDE
        {
            if(mouseEvent->modifiers() & Qt::ControlModifier)
            {
                mouseEvent->ignore();
            }
            else
            {
                QGraphicsItem::mousePressEvent(mouseEvent);
                //Do what you want...
            }
        }
    

  • 您好,但我仍然想保持正常的选择能力,我只想禁用多重选择…谢谢您的回答。对不起,在修改插槽内的选择时阻止信号的目的是什么?我不确定是谁在幕后处理选择。如果项目执行此操作,则在修改selectionChanged插槽中的选择时,可能会创建一个信号循环。因此,可能需要阻止信号。@dom0+1,但如果按照您描述的顺序进行检查,则无需阻止信号