2

次のような役割を持つ s をTableView使用して QMLに実装しました。TableViewColumn

TableView {
    TableViewColumn {
        role: "role1"
        title: "Role1"
    }
    ...
}

これは C++ モデルにバインドされ、QAbstractListModelすべてのロールが定義された状態で継承されており、完全に自然だと思います。

QAbstractTableModelただし、列インデックスを使用できるも存在することがわかりました。おそらくそれを使用すべきだったことは理解しましたが、列のインデックスよりもロールの方が好きです。

誰かが を使用する利点を説明してもらえますQAbstractTableModelか?

4

1 に答える 1

3

Qt Widgets と Qt Quick を使用しない限り、1 つもありません。

一般に、Qt にはモデル/ビュー アーキテクチャ があり、このアーキテクチャは Qt ウィジェットまたはQt Quick のいずれかで使用できます。両方で同じ概念ですが、View クラスは 2 つの間で、特にテーブル ビューが異なります。

Qt Widgets にはQTableViewがあり、このビューはモデル データがテーブル (行と列) に配置されることを想定しているため、QAbstractTableModel のサブクラスを使用してこのデータを提供します。

ただし Qt Quick では、TableViewタイプはQTableViewクラスの 1 対 1 のコピーではありません。実際には完全に異なり、提供されたモデルのデータは、テーブルではなくリスト (つまり、行が 1 列のみ) に配置されることを期待しています。データの配列のようなテーブルを実現するために、TableView タイプは列のルーでロールを使用します。

したがって、Qt ウィジェットでは QTableView クラスを使用し、QAbstractTableModel のサブクラスを使用してテーブル レイアウト (行と列) でデータを提供できますが、Qt Quick では TableView タイプを使用し、QAbstractListModel のサブクラスを使用して提供します。リスト レイアウト (行と 1 列のみ) のデータですが、各セルに Qt::DisplayRole のみを表示する代わりに、TableView の各列で使用される異なるロールを宣言できます。

一方が他方よりも多くの値を持っていたわけではなく、一方のビュー タイプ/クラスが他方とは異なる形式のデータを期待しているだけです。

Qt がこれを不必要に複雑にしていると考えている場合は、テーブル ビューが奇妙なアヒルであることを知っておいてください。リスト ビューについて話している場合、QListView (Qt Widgets) クラスと ListView (Qt Quick) タイプは実際にはほぼ 1 対 1 の動作であり、どちらも同じモデルを交換可能に使用できます。つまり、モデルを共有ライブラリに配置し、変更なしで Qt Quick または Qt Widgets アプリケーションで使用できます。同じことは QTableView/TableView でも達成できますが、モデルは両方の期待をサポートし、データを行と列を持つテーブルと行とロールを持つリストの両方として表示する必要があることに注意してください。

それがあなたの質問に答えることを願っています。

次回まで想像力を働かせて創造的にデザインしましょう

于 2015-05-28T00:30:26.023 に答える