2

の基になるデータ ソースの実装について一般的な質問がありQAbstractTableModelます。

このQAbstractTableModel::data()関数は、行と列の値で構成されるインデックスによってデータ ソースのコンテンツにアクセスします。

基になるデータ ソースがQListクラスPersonであり、各メンバーが列を表す場合、特定の列インデックスを使用してそのメンバーにアクセスするにはどうすればよいですか?

Person私が考えることができる唯一のアプローチは、列番号をクラスのメンバーにマップする一種のマッピングを使用することです。

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole)
    {
        Person person = mySource[index.row()];

        if (index.column() == 0)
            return person.getName();
        else if (index.column() == 1)
            return person.getAdress();
        (...and so on..)
    }
    return QVariant();
}

これはこの問題に取り組むためのアプローチですか、それともより良いものがありますか? 私のクラスに 50 人のメンバーがいる場合、それは大変な作業になります。経由でソースにデータを書き込むときも、同じことを行う必要がありますQAbstractTableModel::setData()

Qtでのモデル/ビュー実装のこの部分を理解するのに役立つ資料への回答またはリンクは非常に高く評価されています.

4

2 に答える 2

0

これはこの問題に取り組むためのアプローチですか、それともより良いものがありますか?

確かに有効なアプローチです、はい。QMetaObjectを使用しても、これに対するイントロスペクション機能はありません。

私のクラスに 50 人のメンバーがいる場合、それは大変な作業になります。QAbstractTableModel::setData() を介してソースにデータを書き込むときも、同じことを行う必要があります。

50 の異なるメンバーを取得する可能性はほとんどありませんが、その場合、いずれにしてもクラスの管理は本質的に複雑になります。

Qtでのモデル/ビュー実装のこの部分を理解するのに役立つ資料への回答またはリンクは非常に高く評価されています.

ここにリンクすることはあまりありません。詳細については、上記を参照してください。

于 2013-10-06T05:57:33.600 に答える
0

私は自分の問題に対する答えを見つけたと思います。すべてが詳細にどのように機能するかはよくわかりませんが、それが進むべき道だと思います()。

[...] モデル メソッドはアイテム インデックスの概念を使用してアイテムを処理しますが、行番号と列番号、および親のインデックスだけを使用してアイテムの表現を正確に特定することができない、または便利でない場合があります。幸いなことに、インデックスはそれ以上のものを持っています。ポインター (void*) または追加の数値 (int) をインデックスに関連付けることができます。インデックスは、アイテムの内部データ表現を指すことができます (データ構造へのポインターまたは配列内の要素のインデックスのいずれか)。または類似のもの)。そのメカニズムのおかげで、メソッドは項目を表すデータ構造に直接アクセスできます。

http://www.qtcentre.org/wiki/index.php?title=QAbstractItemModel#Implementing_custom_modelsから

于 2013-10-06T18:07:41.550 に答える