Создание модели для данных, хранящихся в QHash - PullRequest
0 голосов
/ 05 января 2012

У меня есть 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 ]

0 голосов
/ 08 января 2012

Использование QMap вместо QHash кажется более разумным, как рекомендует Неокс в своем комментарии.

EDIT:

ОК, после внедрения я обнаружил проблемы: Допустим, у меня есть идентификаторы 100,102,103,105 (101, 104 недоступны), в моей модели будут "дыры".

Что происходит, так это то, что модель имеет 4 элемента, и когда я запрашиваю элемент № 2, QMap :: at (1) вернет NULL. Кажется на практике, 102 будет на # 3. Arg ...: (

РЕДАКТИРОВАТЬ 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 (), например, я думал, что значения были кэшированы внутри представления, но я ошибся).

0 голосов
/ 05 января 2012

Кстати, какой у вас хэш: например, если QHash<int, QVariant>, вы можете использовать ключевую часть в качестве «индекса» в модели.

...