为QHash中存储的数据创建模型

时间:2012-01-05 07:31:35

标签: model-view-controller qt4 qhash

我想要在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];

这个想法看起来很混乱,我想要更好的实施。

2 个答案:

答案 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()方法中调用的,例如,我认为在视图中缓存的值,但我错了)。