我想要在QTableView中显示的QHash项目。所以我需要一个模型。 MyClass有一个内部id,用于插入地图。像这样:
// 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];
这个想法看起来很混乱,我想要更好的实施。
答案 0 :(得分:0)
顺便提一下你有什么样的哈希:例如如果QHash<int, QVariant>
您可以将关键部分用作模型中的“索引”。
答案 1 :(得分:0)
使用QMap代替QHash似乎更合理,正如Neox在他的评论中所推荐的那样。
编辑:
好的,实施后我发现了问题: 假设我有ID 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()方法中调用的,例如,我认为在视图中缓存的值,但我错了)。