如何禁用qgraphicsitem的多选?

问题描述 投票:0回答:3

似乎多选

QGraphicsItem
默认是按Ctrl按钮。 但是可以禁用这个功能吗?或者重新加载这个功能?

c++ qt qgraphicsitem
3个回答
3
投票

这是由项目的标志控制的。要禁用对特定项目的选择,请执行

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

如果您想完全禁用为

QGraphicsScene
选择项目,无论项目标志如何,我建议将
QGraphicsScene::selectionChanged
连接到
QGraphicsScene::clearSelection

如果您想禁用多项选择,我建议如下:

  • 子类化 QGraphicsScene 并保留指向 QGraphicsItem 的指针
    lastSelection
  • 创建一个连接到
    QGraphicsScene::selectionChanged
  • 的插槽
  • 检查
    selectedItems
    • 它是空的:无事可做(=未选择任何内容)
    • 仅包含
      lastSelection
      :无事可做(=选择并没有真正改变)
    • 包含一个项目,而不是
      lastSelection
      :将
      lastSelection
      设置为该项目(=第一次选择一个项目)
    • 包含两项:其中一项必须是
      lastSelection
      。从选择中删除该项目 (
      lastSelection->setSelected(false);
      ),将
      lastSelection
      设置为剩余项目。 (=选择了另一个项目,将选择移至该项目)

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


3
投票

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

  1. QGraphicsItem
    创建您自己的 Dirived 类。
  2. 重载受保护的

    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...
            }
        }
    

0
投票

这是一种不需要推导的替代方法。它会取消选择场景中除您想要选择的对象之外的所有对象:

template <class ObjectT>
void SelectObjectUniquely ( ObjectT & rObject, QGraphicsScene & rScene )
{
    rObject.setSelected ( true );

    QList<QGraphicsItem *>  graphic_items = rScene.selectedItems();

    for ( auto it : graphic_items )
    {
        QGraphicsItem * the_item = it;

        if ( it != &rObject )
            it->setSelected ( false );
    }
}

ObjectT 是从 QGraphicsItem 派生的对象。

© www.soinside.com 2019 - 2024. All rights reserved.