似乎多选
QGraphicsItem
默认是按Ctrl按钮。
但是可以禁用这个功能吗?或者重新加载这个功能?
这是由项目的标志控制的。要禁用对特定项目的选择,请执行
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
如果您想完全禁用为
QGraphicsScene
选择项目,无论项目标志如何,我建议将 QGraphicsScene::selectionChanged
连接到 QGraphicsScene::clearSelection
。
如果您想禁用多项选择,我建议如下:
lastSelection
QGraphicsScene::selectionChanged
selectedItems
:
lastSelection
:无事可做(=选择并没有真正改变)lastSelection
:将 lastSelection
设置为该项目(=第一次选择一个项目)lastSelection
。从选择中删除该项目 (lastSelection->setSelected(false);
),将 lastSelection
设置为剩余项目。 (=选择了另一个项目,将选择移至该项目)在修改槽内的选择期间,您可能需要阻止信号。
禁用多项选择的简单方法是:
QGraphicsItem
创建您自己的 Dirived 类。重载受保护的
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...
}
}
这是一种不需要推导的替代方法。它会取消选择场景中除您想要选择的对象之外的所有对象:
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 派生的对象。