如何禁用qgraphicsitem的多选?

3

我刚接触Qt,貌似qgraphicsitem默认的多选操作是按下Ctrl键。但是能不能禁用这个功能或重新加载此功能呢?

2个回答

4

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

item->setFlag(QGraphicsItem::ItemIsSelectable, false);

如果您想完全禁用QGraphicsScene的项目选择功能,无论项目标志如何,我建议将QGraphicsScene :: selectionChanged连接到QGraphicsScene :: clearSelection。
如果您想禁用多重选择,请执行以下操作:
- 子类化QGraphicsScene并保留指向QGraphicsItem的指针lastSelection - 创建一个与QGraphicsScene :: selectionChanged连接的槽 - 检查selectedItems: - 它为空:无需执行(未选择任何内容) - 仅包含lastSelection:无需执行(选择没有真正更改) - 包含一个项目,而不是lastSelection:将lastSelection设置为该项目(首次选择一个项目) - 包含两个项目:其中一个必须是lastSelection。从选择中删除那个项目(lastSelection->setSelected(false);),将lastSelection设置为剩余项目。(选择另一个项目,并移动选择到它)
在槽内修改选择时,您可能需要阻止信号。

嗨,但我仍然希望保留正常的选择功能,我只想禁用多重选择... - Nyaruko
感谢您的回答。 - Nyaruko
抱歉,但在槽内修改选择时阻止信号的目的是什么? - Nyaruko
我不确定谁在幕后处理选择。如果是项目,则可能在从selectionChanged槽修改选择时创建信号循环。因此,可能需要阻止信号。 - dom0
@dom0 +1,但如果您按照您描述的顺序进行检查,则无需阻止信号。 - Oliver

3

禁用多选的简单方法是:

  1. Create your own Dirived class from QGraphicsItem.
  2. Overload the protected mousePressEvent function and disable 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...
            }
        }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接