QAbstractItemModel
Qt では、既存のデータ構造をラップする独自のツリー モデルを (サブクラス化によって) 作成しています。モデルを介してだけでなく、内部で (モデルを介してではなく) データ構造を更新できる必要があります (ビューが変更できるようにするため)。よりよく想像するために: これは、シーン ビューを使用して (Qt モデルを介さずに) 編集できるシーン グラフですが、アウトライナー (QTreeView
シーン グラフのプロキシとして Qt モデルを使用する) を使用して編集することもできます。
混乱を避けるために、2 つの異なるシナリオを検討する必要があります (以下では、例として「削除」操作を使用します)。
ユーザーは Qt ビューを使用してノードを削除します。ビューは、 を使用してモデルから行を削除したいと考えてい
QAbstractItemModel::removeRow
ます。これにより、基になるデータ構造であるシーン グラフから対応するノードが削除されます。ユーザーはシーン ビューを使用してノードを削除します。シーン ビューは、シーン グラフからノードを削除したいと考えています。シーン グラフをラップするモデルは通知を受け取り、次に接続されたビューに行が削除されたことを通知したいと考えています。
1.の実装方法はわかっていると思いますが、2.の通知部分の実装方法がわかりません。信号と、友達のように聞こえる信号がありQAbstractItemModel::rowsAboutToBeRemoved()
ますrowsRemoved()
。しかし、それらはプライベート シグナルです (ヘッダー ソース コードでは、「QAbstractItemModel によってのみ発行できます」と記述されています)。もありますがbeginRemoveRows()
、endRemoveRows()
ドキュメントによると、更新がビューから発生したとき、つまり が呼び出されたときに呼び出す必要がありますremoveRow
。また、それらを使用しようとすると、ビューが完全に台無しになりました。
ドキュメントによると、モデルクラスが自己変更データをモデル化できることを意図していないようです。別の例として、ファイル システムを考えてみましょう。ディレクトリの変更を検出できるファイル システム監視を使用する場合、ビューがファイル システムの変更に使用されていない場合でも、ディレクトリの変更をライブで表示できるように、モデルはビューに通知する必要があります。そのようなモデルはQtでも可能ですか?