Я использую эти классы:
QHash
: представление всех объектов сцены (не может изменить этот класс)
QList
: представление всех выбранных объектов. Содержит идентификаторы (сохраняются как 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, его идентификатор будет сохранен в Hitslist
(QList
).
После этого HitsList
сортируется и DrawSelectedObjects()
называется.
Это должно повторять QHash
до тех пор counter=77
а также Draw_as_selected()
, После этого первый элемент QList
удаляется, вытягивая вперед второй.
Эта функция вызывается КАЖДЫЙ раз, когда выбирается один объект. С небольшими импортированными сценами все в порядке, но когда я использую файлы размером> 10 МБ, я вижу некоторую задержку вывода (это очевидно, потому что я перебираю огромный QHash
).
Не могли бы вы предложить мне более эффективный способ сделать это? Любая помощь будет оценена.
РЕДАКТИРОВАТЬ:
Спасибо за ваш ответ. Проблема в том, что я не могу избавиться от этого QList<int>
(Я могу вставлять только целые числа в стек выбора OpenGL).
Таким образом, другой путь из вышеупомянутого решения состоит в том, чтобы сделать QString.toInt()
для каждого элемента QHash
и сохранить их в QList<int>
,
Дело в том … как узнать правильный QString
на хеш, используя int
(рассчитывается сейчас путем конвертации из QString
не больше из прилавка) на QList
?
Если для доступа к объектам в хэше используется QString
(Я предполагаю, что «имя» объекта, а не его идентификатор), то вы также должны использовать список 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
Других решений пока нет …