遍历selectedItems()

时间:2015-11-11 15:34:40

标签: qt qgraphicsscene

我在将项目设置为选中时出现问题...所以我看了QGraphicsScene::selectedItems() function
从那以后,我对在循环中使用它变得非常紧张。

在这样的结构中:

foreach(QGraphicsItem* selectedItem, selectedItems())
{ 
    // perform action with selectedItem
}

每次迭代都会重新计算selectedItems()函数吗? (我想是的,因为如果在循环内我改变了选择,上面变得不稳定)

我想这会对我的代码速度产生很大影响......

所以我开始在任何地方改变我的代码:

QList<QGraphicsItem*> sel = selectedItems();
foreach(QGraphicsItem* selectedItem, sel)
{ 
    // perform action with selectedItem
}

我认为这会加快程序的速度吗? (或者它会因为复制而变慢,而循环测试中的替换不会改变,如果我错了并且selectedItems()没有真正完成其所有代码?)

我想知道应该避免哪些其他功能......对于从boundingRect()继承的项目,或许sceneRect()QGraphicsItem ....是否将这些功能复制到{{} 1}}如果在同一个函数中多次使用?

1 个答案:

答案 0 :(得分:0)

foreach(QGraphicsItem* selectedItem, selectedItems())
{ 
    // perform action with selectedItem
}

在这种情况下,您正在迭代返回的所选项目,正如您所发现的,如果更改了选择,则可能会导致问题。

这样更好吗?

QList<QGraphicsItem*> sel = selectedItems();
foreach(QGraphicsItem* selectedItem, sel)
{ 
    // perform action with selectedItem
}

简单的答案是肯定的。

  

由于复制

会使它变慢

不一定。如果容器没有变化,它将没有任何区别。

然而,Qt实现了implicit sharing,这确保了容器(例如QList)在这种情况下将共享数据,并且只在其中一个副本发生更改时才进行复制(COW - 写入时复制)。 / p>

我不会过于担心sceneRectboundingRect,因为它们只返回简单的数据类型,例如QRectF,而不是容器的容器,所以隐式共享不是需要在这里。只有在极端情况下缓存此类返回值才会产生显着差异。