18

私はマッピングアプリケーションに取り組んでおり、テーブル、フォームを使用して、マップ内のグラフィックオブジェクトとしてデータオブジェクトを表示する必要があります。私はPyQtを使用していますが、これはPythonの質問ではなくQtの質問であるため、それほど重要ではありません。

テーブルビューとフォームビューだけが必要な場合、これは簡単ですが、Qt Model/Viewフレームワークを使用するだけです。ただし、グラフィックスビューフレームワークを使用してのみ実際に利用できる機能を提供するには、マップビューが必要です。これは、基本的に、QGraphicsSceneがデータモデルとして機能する独自のモデル/ビューフレームワークです。

これを行うには2つの方法が考えられます。1つは、QAbstractItemModelからサブクラス化された信頼できるモデルから始めて、それをQAbstractItemViewのサブクラスにリンクし、そこからシーン内のQGraphicsItemsを生成および更新することです。QGraphicsItemsとの相互作用を通じて、データアイテムとのユーザーの相互作用と変更を処理する方法がわからないため、これは見苦しいように見えます。

私が考えるもう1つの方法は、QGraphicsSceneを信頼できるデータソースとして扱い、データオブジェクトを各QGraphicsItemの.data()プロパティに格納することです。次に、QAbstractItemModelをサブクラス化し、データストアとしてシーン内のデータにアクセスするように記述します。その後、他のビューはこれをモデルとして使用します。シーン内のデータへの変更をモデルまでどのように伝播しますか?

どちらのアプローチを採用しても、フレームワークでは処理できないギャップがあるようです。モデル/ビューでは、すべての変更がモデルで行われると想定されます。グラフィックビューでは、すべての変更がシーンで行われたと見なされます。

したがって、QAbstractItemModel(authoritative)-> QAbstractItemView-> QGraphicsSceneを選択するか、QGraphicsScene(authoritative)-> QAbstractItemModel->OtherViewsを選択します。なぜあなたはどちらか一方を選ぶのでしょうか、そしてあなたはどんな落とし穴を予想しますか?Qtのツインモデル/ビューフレームワーク間のこのギャップを埋める必要がある人は他にいますか?それをどのように行いましたか?

4

1 に答える 1

15

QAbstractItemModel(authoritative)-> QAbstractItemView-> QGraphicsScene

疑いなく。私は以前にこれを行ったことがありますが、少しの重複(少なくとも私が避けられなかったもの)が必要ですが、それほど悪くはありません。

これにより、非常に優れたシーンとともに、標準ビューでデータを表現することもできます。

私の最善のアドバイスは、作成したtoとaQHashを保存することです。これにより、モデル/ビューランド( )からグラフィックスビューランド()にすばやく移動できます。QPersistantModelIndexQGraphicsItemQGraphicsSceneQAbstractItemViewQModelIndexQGraphicsItem

于 2010-07-06T20:29:31.817 に答える