0

QTableView に表示したい項目の QHash があります。だから私はモデルが必要です。MyClass には、マップへの挿入に使用される内部 ID があります。このようなもの:

// when adding a new item
my_super_hash[item->id] = item;

モデルを実装すると、モデル内のすべてのメソッドがクリックされた「インデックス」(または何でも...) について話していることがわかりました。

QHash とモデルをマッピングする方法を教えてもらえますか? (キーベースの QHash で、モデルはインデックスベースです)。


オプション 1 - 理想的ではない

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がコメントで推奨しているように、QHashの代わりにQMapを使用する方が合理的です。

編集:

OK、実装後に問題が見つかりました: 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 に答える