Return to Linux Life Edit

  ホーム · 全てのクラス · メインのクラス · 注釈付き · グループ別 · 関数一覧

次へ モデル&ビューの使い方]

モデル/ビュー プログラミング

はじめに

Qt 4 ではモデル/ビュー アーキテクチャに基づいてデータとユーザに対する表示方法とを管理できる新しいアイテムビュークラスが導入されている. このアーキテクチャを導入することで各機能が分離され、その結果、開発者は大きな柔軟性と従来可能であった以上のアクセスを得ることができる. 本文書では、モデル/ビュー パラダイムに関するおおまかなイントロダクションをおこない、そのコンセプトの外観を伝え、アイテムビューシステムのアーキテクチャに関して説明する. このアーキテクチャにおける各々のコンポーネントについて解説を加え、クラスの利用法については例として示す.

モデル/ビュー アーキテクチャ

モデル-ビュー-コントローラ (MVC) は Smalltalk を起源とするデザインパターンであり、ユーザインターフェースを構築する際にしばしば用いられる. Gamma らは Design Patterns (訳註: 本位田ら監訳『オブジェクト指向における再利用のためのデザインパターン』ソフトバンクパブリッシング, 1999. )において次のように書いている:

MVC は三種類のオブジェクトから構成される. モデルオブジェクトはアプリケーションオブジェクト、ビューオブジェクトは画面の表現、コントローラオブジェクトはユーザ入力に対するユーザインターフェースの働きを定義している. MVC の概念が生まれる前は、ユーザインターフェース設計ではこれらを一つのオブジェクトにまとめる傾向にあったが、 MVC では、柔軟性と再利用性を向上させるためにこれらをお互いに独立させて扱っている.

ここでビューとコントローラのオブジェクトをひとまとめにしたものがモデル/ビュー アーキテクチャである. データの格納とユーザに対するデータの表示については依然分離されているが、MVC と同じ考えに基づいた、より簡略なフレームワークを提供する. モデルとビューを分離することで、同じデータをいくつかの違ったビューで表示することができ、またデータ構造に変更を加えることなく、新しいタイプのビューを実装することが可能となる. ユーザの入力を柔軟に処理できるようにするために、 デリゲートの概念が導入されている. このフレームワークにデリゲートを導入することで、データアイテムの表示や編集をカスタマイズできるようになった.

モデル/ビュー アーキテクチャ

モデルはデータソースと通信をし、アーキテクチャ内の他のコンポーネントに対して インターフェース を提供する. 通信の方法については、データソースのタイプおよびモデルの実装に依存する.

ビューはモデルから モデル インデックス を得る. これはデータアイテムに対するリファレンスである. モデルに対して モデル インデックス を渡すことで、ビューはデータソースからデータアイテムを取得することができる.

標準的なビューにおいて、 デリゲート はデータアイテムをレンダリングする. アイテムが編集された場合、デリゲート は モデル インデックス を用いてモデルと直接通信する.

一般に、モデル/ビュー クラスは上に示したモデル、ビュー、デリゲートの三種類のグループに分類できる. これらのコンポーネントのそれぞれは 抽象 クラスによって定義されており、これによって共通のインターフェースが提供されるとともに、一部の機能についてはデフォルトの実装が提供されている. 抽象クラスは他のコンポーネントに機能を提供するため、サブクラス化して利用することが前提となっており、特殊化したコンポーネントを作ることができるようになっている.

モデル、ビュー、およびデリゲートは シグナルとスロットを使って互いにやりとりをする:

モデル

全てのアイテムモデルは QAbstractItemModel を基底クラスとする. このクラスにより、ビューとデリゲートがデータへアクセスする際に使用するインターフェースが定義される. データはモデルに格納されているのではなく、データ本体は他のクラス、ファイル、データベース、または他のアプリケーションコンポーネントによって提供される. QAbstractItemModel はデータへのインターフェースを提供し、ビューはこのインターフェースを使ってデータを取り出すことで、テーブルやリスト、ツリーの形で表示をおこなうことができるようになっている. リストやテーブルのデータ構造を持つ新しいモデルを実装する場合には、 QAbstractListModel QAbstractTableModel のクラスを基底クラスとし、それを派生させて作るのが良い. これらのクラスでは、一般的な機能に関して適切なデフォルトの実装が用意されている. 特殊なリストやテーブルをサポートするために、それぞれのクラスをサブクラス化して用いることもできる.

QStandardItemModel クラスは任意の型のデータを中に入れることのできる、すぐに使える (ready-to-use) モデルである.

ビュー

異なる種類のビューを実現する実装がある: QListView はアイテムのリストを表示し、 QTableView はモデルから得られたデータをテーブルの形で表示し、 QTreeView はモデルのデータアイテムを階層構造を持ったリストの形で表示する. 各々のクラスは QAbstractItemView を抽象基底クラスとしている. これらのクラスはすぐに使える (ready-to-use) 実装であるが、サブクラス化してカスタマイズしたビューを作ることもできる.

デリゲート

QAbstractItemDelegate はモデル/ビュー フレームワークにおけるデリゲートの抽象基底クラスである. デフォルトのデリゲートの実装は QItemDelegate によるものであり、これは Qt の標準ビューにおいてデフォルトのデリゲートとして利用されている.

便宜的なクラス

標準ビュークラスとしていくつかの 便宜的な ラスが用意されており、 Qt におけるアイテムベースのビューおよびテーブルクラスとともに使いやすいようになっている. サブクラス化しにくいが、Qt 3 でのクラスと同等の、親しみやすいインターフェースが既に用意されている. こうしたクラスとしては QListWidget QTreeWidget、および QTableWidgetが挙げられる. これらは Qt 3 における QListBox QListView、および QTable とよく似ている.

これらのクラスはビュークラスよりも柔軟性に乏しく、任意のモデルと組み合わせて利用するといったことはできない. アイテムベースのクラスをどうしても利用しなければならない場合を除き、アイテムビューのデータを操作する場合には、モデル/ビュー アプローチの利用をお勧めする.

モデル/ビュー コンポーネント

以下のセクションでは Qt で使われるモデル/ビュー パターンについての解説をおこなう. 各々のセクションでは、新しいコンポーネントを作る方法の例を取り上げて説明をおこなっている.

のリストについても参照されたい. モデル/ビュー クラス.

関連する例

[Next: モデルとビューの利用]


Copyright © 2005 Trolltech Trademarks
Qt 4.0.0