我在将项目设置为选中时出现问题...所以我看了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}}如果在同一个函数中多次使用?
答案 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>
我不会过于担心sceneRect
和boundingRect
,因为它们只返回简单的数据类型,例如QRectF
,而不是容器的容器,所以隐式共享不是需要在这里。只有在极端情况下缓存此类返回值才会产生显着差异。