Создание модели для данных, хранящихся в QHash
У меня есть QHash элементов, которые я хочу отобразить в QTableView. Поэтому мне нужна модель. MyClass имеет внутренний идентификатор, который используется для вставки в карту. Что-то вроде этого:
// when adding a new item
my_super_hash[item->id] = item;
При реализации модели я обнаружил, что все методы в модели говорят об "индексе", по которому щелкнули (или что-то еще...).
Может кто-нибудь напомнить мне, как сопоставить QHash и модель? (QHash, основанный на ключах, а модель на основе индексов).
Вариант 1 - не идеал
Одним из вариантов является создание при запуске списка, который отображается между индексом и ключом:
int i = 0;
foreach( MyClass* c, my_super_hash )
conversion[i] = c->id
Теперь внутри методов повторной реализации моделей, я использую
int key = conversion[index.row()];
MyClass * value = my_super_hash[key];
Эта идея кажется грязной, и я хочу лучшую реализацию.
2 ответа
Использование QMap вместо QHash кажется более разумным, как рекомендует Neox в своем комментарии.
РЕДАКТИРОВАТЬ:
Хорошо, после реализации я обнаружил проблемы: допустим, у меня есть идентификаторы 100,102,103,105 (101, 104 не доступны), в моей модели будут "дыры".
Что происходит, так это то, что модель имеет 4 элемента, и когда я запрашиваю номер элемента #2, QMap::at(1) вернет NULL. Кажется на практике, 102 будет на #3. Арг...:(
РЕДАКТИРОВАТЬ 2:
Я попробовал этот код:
#if 0
return my_super_map.at(index);
#else
int i = 0;
foreach (MyClass *c, my_super_map) {
if (i == index)
return c;
i++;
}
return NULL;
#endif
Хотя это работает, это чертовски медленно. Мне может понадобиться сделать еще одну таблицу перевода, как в оригинальном ответе. (это вызывается внутри метода data(), например, я думал, что значения были кэшированы внутри представления, но я ошибся).
Кстати, какой у вас хэш: например, если QHash<int, QVariant>
Вы можете использовать ключевую часть в качестве "индекса" в модели.