我正在使用这些课程:
QHash
:代表场景的所有对象(无法修改此类)
QList
:代表所有选定的对象。它包含ID(保存为int
)
//DrawSelectedObjects(){
QHash<QString, SceneObject*>& hash=sc->getObj();
QList<int> tempList = HitsList;
int counter =0;
for (QHash<QString,SceneObject*>::ConstIterator i = hash.begin();i!=hash.end();++i) {
if (tempList.startsWith(counter)) {
.
Draw_as_selected()
.
tempList.removeOne(counter);
}
}
}
因此,例如,如果我选择对象#77,其ID将保存在Hitslist
(QList
)中。
之后HitsList
已排序并且DrawSelectedObjects()
被调用。
必须迭代QHash
,直到counter=77
和Draw_as_selected()
。之后,移除QList
的第一个元素,将第二个元素拉到前面。
每次选择一个对象时都会调用此函数。使用小的导入场景一切正常,但是当我使用&10MB的文件时,我可以看到一些输出滞后(很明显,因为我正在迭代一个巨大的QHash
)。
你能建议我一个更有效的方法吗?任何帮助将不胜感激。
编辑:
感谢您的回复。问题是我无法摆脱QList<int>
(我只能在OpenGL选择堆栈的顶部推送整数)。
上述解决方案的另一种方法是对QString.toInt()
的每个元素执行QHash
并将其保存到QList<int>
。
事实是......如何使用QString
(现在通过int
转换计算,而不是来自计数器的更多信息)在{{{{}}上查找正确的QString
1}}?
答案 0 :(得分:2)
如果您在散列中访问对象的方式是使用QString
(我猜对象的“名称”而不是其ID),那么您还应该使用QString
列表存储选定的对象。
QHash<QString, SceneObject*> & hash = getAllObjects();
QList<QString> & tempList = getSelectedObjects();
foreach(QString name, tempList)
hash[name]->drawAsSelected(); // or drawAsSelected(hash[name]) depending on your design