Model view controller 为存储在QHash中的数据创建模型

Model view controller 为存储在QHash中的数据创建模型,model-view-controller,qt4,qhash,Model View Controller,Qt4,Qhash,我有一个要在QTableView中显示的项目的QHash。所以我需要一个模型。MyClass有一个内部id,用于插入到映射中。大概是这样的: // when adding a new item my_super_hash[item->id] = item; 在实现这个模型时,我发现模型中的所有方法都在谈论被点击的“索引”(或者其他什么…) 有人能告诉我如何在QHash和模型之间映射吗?(QHash是基于密钥的,模型是基于索引的) 选项1-不理想 一个选项是在启动时创建一个列表,该列表在

我有一个要在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];

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

顺便问一下,你有什么类型的散列:例如,如果
QHash
你可以使用关键部分作为模型中的“索引”

正如Neox在评论中建议的那样,使用QMap而不是QHash似乎更合理

编辑:

好的,实施后我发现了问题: 假设我有ID100102103105(101104不可用),我的模型将有“洞”

发生的情况是,模型有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()方法中调用的,我认为值缓存在视图中,但我错了).

我可能不明白你在问什么,或者我无法理解Qt4中的MVC实现:QModelIndex我得到了具体的列/行已被单击(或已绘制)。我无法使用该数字作为键值,因为ID可能从1000开始,并且模型可能只包含10个值(1000, 1243, 7772, 9811234)。抱歉,我假设散列中的键将按1到20的顺序排列,以便您可以将它们用作索引。但我发现情况并非如此。在我看来,您的实现虽然杂乱无章,但不可避免。在我的实践中,如果数据中的键不能用作索引,我通常会使用QMaps。请添加一个新的答案,即“使用QMap而不是QHash”,你会得到更多的声誉,这个问题会得到一个绿色分数。