Создание модели для данных, хранящихся в 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];

Эта идея кажется беспорядочной, и я хочу лучшей реализации.


person elcuco    schedule 05.01.2012    source источник


Ответы (2)


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

person Neox    schedule 05.01.2012
comment
Я, вероятно, не понимаю, о чем вы спрашиваете, или я не понимаю что-то о реализации MVC в Qt4: QModelIndex, который я получаю, определяет, какой столбец/строка был нажат (или окрашен). Я не могу использовать этот номер в качестве значения ключа, потому что ID может начинаться с 1000, а модель может содержать только 10 значений (1000, 1243, 7772, 9811234). - person elcuco; 05.01.2012
comment
Извините, я предполагал, что ключи в хеше будут упорядочены от 1 до 20, чтобы вы могли использовать их в качестве индексов. Но я вижу, что это не так. Что ж, на мой взгляд, ваша реализация хоть и грязная, но неизбежная. В своей практике я обычно использую QMaps, если ключи в моих данных нельзя использовать в качестве индексов. - person Neox; 05.01.2012
comment
Добавьте новый ответ, сказав, что используйте QMap вместо QHash, и вы получите больше репутации, и этот вопрос получит зеленую отметку. - person elcuco; 05.01.2012

Использование 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(), я думал, что значения кэшируются внутри представления, но я ошибался).

person elcuco    schedule 08.01.2012