短い答え
QtのMVCは1つのデータ構造にのみ適用されます。MVC アプリケーションについて話すときは、QAbstractItemModel
またはについて考えるべきではありませんQListView
。
プログラム全体にMVCアーキテクチャが必要な場合、Qtにはそのような「巨大な」モデル/ビューフレームワークはありません。しかし、プログラムのデータのリスト/ツリーごとに、実際にはビュー内にコントローラーがあるQt MVCアプローチを使用できます。データは、内部または外部のモデルです。これは、使用しているモデルのタイプに依存します(独自のモデルサブクラス:おそらくモデル内。例:QSqlTableModel:外部(ただし、モデル内にキャッシュされる可能性があります))。モデルとビューを組み合わせるには、ビジネスロジックを実装する独自のクラスを使用します。
長い答え
Qtのモデル/ビューのアプローチと用語:
Qtはモデルにシンプルなビューを提供します。彼らは持っているコントローラの項目を編集し、移動、選択、ほとんどの場合、何か何コントローラ「コントロール」です:に建てられています。つまり、ユーザー入力(マウスのクリックと移動)を解釈し、適切なコマンドをモデルに与えます。
Qtのモデルは確かに基礎となるデータを持つモデルです。もちろん、Qtはそれらをどのように格納したいのかわからないため、抽象モデルはデータを保持しません。しかし、あなたはサブクラスにあなたのデータコンテナを追加し、あなたのデータにアクセスするモデル・インタフェースを作ることによって、あなたのニーズにQAbstractItemModelを拡張します。したがって、実際には、これが気に入らないと思いますが、問題は、モデルをプログラムする必要があることです。つまり、データにアクセスし、データ構造で変更する方法です。
MVC用語では、モデルにはデータとロジックの両方が含まれます。Qtでは、ビジネスロジックの一部をモデルの中に含めるか、それを外部に置くか、それ自体が「ビュー」であるかは、あなた次第です。ロジックの意味すら明確ではありません。アイテムの選択、名前の変更、移動はどうでしょうか。=>すでに実装されています。それらを使って計算していますか?=>モデルサブクラスの外側または内側に配置します。ファイルとの間でデータを保存またはロードしますか?=>モデルサブクラス内に配置します。
私の個人的な意見:
良い提供することは非常に困難であるとプログラマに一般的なMV(C)システムを。ほとんどの場合、モデルは単純なため(たとえば、文字列リストのみ)、Qtはすぐに使用できるQStringListModelも提供します。しかし、データが文字列よりも複雑な場合は、Qtモデル/ビューインターフェースを介してデータをどのように表現するかはあなた次第です。たとえば、3つのフィールドを持つ構造体(名前、年齢、性別を持つ人物など)がある場合、3つのフィールドを3つの異なる列または3つの異なるロールに割り当てることができます。どちらのアプローチも嫌いです。
Qtのモデル/ビューフレームワークは、単純なデータ構造を表示する場合にのみ役立つと思います。データがカスタムタイプであるか、ツリーやリスト(グラフなど)で構造化されていない場合、処理が難しくなります。ほとんどの場合、リストで十分であり、場合によっては、モデルは単一のエントリのみを保持する必要があります。特に、異なる属性を持つ1つのエントリ(1つのクラスの1つのインスタンス)をモデル化する場合、Qtのモデル/ビューフレームワークは、ロジックをユーザーインターフェイスから分離する適切な方法ではありません。
まとめると、Qtのモデル/ビューフレームワークは、データがQtのビューアウィジェットの 1つで表示されている場合にのみ役立つと思います。アプリケーションの設定など、1つのエントリのみを保持するモデルの独自のビューアを作成する場合や、データが印刷可能なタイプでない場合は、まったく役に立ちません。
(より大きい)アプリケーション内でQtモデル/ビューをどのように使用しましたか?
私はかつて、複数のQtモデルを使用してデータを管理するアプリケーションを(チームで)作成しました。DataRole
異なるモデルサブクラスごとに異なるカスタムタイプの実際のデータを保持するを作成することにしました。Model
すべての異なるQtモデルを保持するという外部モデルクラスを作成しました。またView
、内のモデルに接続されているウィンドウ(ウィジェット)を保持するという外部ビュークラスも作成しましたModel
。したがって、このアプローチは、Qt MVCの拡張であり、私たち自身のニーズに適合しています。Model
とView
クラス自体は、Qt MVCとは何の関係もありません。
ロジックをどこに配置しましたか?ソースモデルからデータを読み取り(変更された場合)、結果をターゲットモデルに書き込むことにより、データの実際の計算を行うクラスを作成しました。Qtの観点から見ると、このロジッククラスはモデルに「接続」するため、ビューになります(ユーザーの「ビュー」ではなく、アプリケーションのビジネスロジック部分の「ビュー」)。
コントローラはどこにありますか?元のMVC用語では、コントローラーはユーザー入力(マウスとキーボード)を解釈し、要求されたアクションを実行するコマンドをモデルに提供します。Qtビューはアイテムの名前変更や移動などのユーザー入力をすでに解釈しているため、これは必要ありませんでした。しかし、必要なのは、Qtビューを超えるユーザーインタラクションの解釈です。