0

我正在使用这些类:

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=77Draw_as_selected()。之后,QList删除第一个元素,将第二个元素拉到前面。

每次选择一个对象时都会调用此函数。导入的小场景一切正常,但是当我使用大于 10MB 的文件时,我可以看到一些输出滞后(很明显,因为我正在迭代一个巨大的QHash)。

你能建议我一个更有效的方法吗?任何帮助,将不胜感激。

编辑:

感谢您的回复。问题是我无法摆脱它QList<int>(我只能将整数推送到 OpenGL 选择堆栈的顶部)。

因此,上述解决方案的另一种方法是对QString.toInt()的每个元素执行QHash并将它们保存到QList<int>.

事实是......如何使用(现在通过转换计算,不再从计数器计算)在QString哈希上找出正确的?intQStringQList

4

1 回答 1

2

如果您访问散列中的对象的方式是使用 a 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
于 2013-06-13T02:33:01.393 回答