1

QAbstractItemModelQt では、既存のデータ構造をラップする独自のツリー モデルを (サブクラス化によって) 作成しています。モデルを介してだけでなく、内部で (モデルを介してではなく) データ構造を更新できる必要があります (ビューが変更できるようにするため)。よりよく想像するために: これは、シーン ビューを使用して (Qt モデルを介さずに) 編集できるシーン グラフですが、アウトライナー (QTreeViewシーン グラフのプロキシとして Qt モデルを使用する) を使用して編集することもできます。

混乱を避けるために、2 つの異なるシナリオを検討する必要があります (以下では、例として「削除」操作を使用します)。

  1. ユーザーは Qt ビューを使用してノードを削除します。ビューは、 を使用してモデルから行を削除したいと考えていQAbstractItemModel::removeRowます。これにより、基になるデータ構造であるシーン グラフから対応するノードが削除されます。 シナリオ 1 のコール

  2. ユーザーはシーン ビューを使用してノードを削除します。シーン ビューは、シーン グラフからノードを削除したいと考えています。シーン グラフをラップするモデルは通知を受け取り、次に接続されたビューに行が削除されたことを通知したいと考えています。 シナリオ 2 での呼び出し

1.の実装方法はわかっていると思いますが、2.の通知部分の実装方法がわかりません。信号と、友達のように聞こえる信号がありQAbstractItemModel::rowsAboutToBeRemoved()ますrowsRemoved()。しかし、それらはプライベート シグナルです (ヘッダー ソース コードでは、「QAbstractItemModel によってのみ発行できます」と記述されています)。もありますがbeginRemoveRows()endRemoveRows()ドキュメントによると、更新がビューから発生したとき、つまり が呼び出されたときに呼び出す必要がありますremoveRow。また、それらを使用しようとすると、ビューが完全に台無しになりました。

ドキュメントによると、モデルクラスが自己変更データをモデル化できることを意図していないようです。別の例として、ファイル システムを考えてみましょう。ディレクトリの変更を検出できるファイル システム監視を使用する場合、ビューがファイル システムの変更に使用されていない場合でも、ディレクトリの変更をライブで表示できるように、モデルはビューに通知する必要があります。そのようなモデルはQtでも可能ですか?

4

1 に答える 1

1

あなたはそれを間違って読んでいます。モデルは、「ジオメトリ」の変更を開始しようとしているときに、ユーザーに通知する必要があります。そのため、モデルから行が削除されたとしても、それが発生したことを外部に知らせる必要がありますビューがモデルから行を削除するときの一連のイベントは次のとおりです。

  1. ビューは を呼び出しますmodel->removeRows()

  2. モデルが呼び出すbeginRemoveRows()

  3. モデルは実際に内部データから行を削除します。

  4. モデルは を呼び出しますendRemoveRows()

を呼び出さずに行を削除する他のインターフェイスを実装する場合はmodel->removeRows()、まったく同じことを行う必要があります。モデルから行を削除するのがビューであるか他のコードであるかは関係ありません。モデルの動作は同じでなければなりません。そうでなければ、何も機能しません。

SceneGraph とモデルの間に挿入されるアダプター クラスを設計できます。シーングラフとモデルへのポインターを保持し、2 つの間で操作を変換する必要があります。

于 2013-10-05T19:57:13.287 に答える