2012-01-05 2 views
0

У меня есть QHash элементов, которые я хочу отобразить в QTableView. Поэтому мне нужна модель. MyClass имеет внутренний идентификатор, который используется для вставки в карту. Что-то вроде этого:Создание модели для данных, хранящихся в QHash

// 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]; 

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

ответ

0

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

EDIT:

OK, после реализации я нашел проблемы: Допустим, у меня есть идентификаторы 100102103105 (101, 104 не доступны), моя модель будет иметь «дыры» в нем.

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

EDIT 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

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

+0

Я, вероятно, не понимаю, что вы спрашиваете, или я не могу понять, что-то о реализации MVC в Qt4: QModelIndex Я получаю конкретный столбец/строку en щелкнул (или был нарисован). Я не могу использовать этот номер в качестве значения ключа, поскольку идентификатор может начинаться с 1000, а модель может содержать только 10 значений (1000, 1243, 7772, 9811234). – elcuco

+1

Извините, я предполагал, что ключи в хэше будут упорядочены как 1-20, чтобы вы могли использовать их в качестве индексов. Но я вижу, что это не так. Ну, на мой взгляд, ваша реализация хоть и беспорядочна, но неизбежна. В моей практике я обычно использую QMaps, если ключи в моих данных не могут использоваться в качестве индексов. – Neox

+0

Добавьте новый ответ, говоря «используйте QMap вместо QHash», и вы получите больше репутации, и этот вопрос получит зеленый знак. – elcuco

Смежные вопросы