0

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

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

4

2 回答 2

0

顺便说一句,你有什么样的散列:例如,如果QHash<int, QVariant>你可以将关键部分用作模型中的“索引”。

于 2012-01-05T08:37:16.110 回答
0

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

编辑:

好的,实施后我发现了问题:假设我的 ID 为 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() 方法中调用,我认为缓存在视图中的值,但我错了)。

于 2012-01-08T08:55:46.210 回答