Создание модели для данных, хранящихся в 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> Вы можете использовать ключевую часть в качестве "индекса" в модели.

Другие вопросы по тегам