2

ご挨拶、

モデルからのオブジェクトの任意のセットの削除の取り消し/やり直しをサポートするために、厄介なコードを書いています。他のすべてのミューテーター (追加/コピー/貼り付け) はこの機能のサブセットであるため、これについては正しく行っているように感じます。

コードは私にとって必要以上に厄介です。主に、モデルを変更する唯一の方法は、beginInsertRows/beginRemoveRows を呼び出して範囲内の行を削除することです (一度に 1 行ずつ実行するだけで、「隣人」を単一に最適化する必要はありません)。まだ電話する)

beginInsertRows/beginRemoveRows の問題は、行の削除が別の QModelIndex (たとえば、リストにキャッシュされたもの) に影響を与える可能性があることです。例えば:

ParentObj
   ->ChildObj1
   ->ChildObj2
   ->ChildObj3

ChildObj1 と ChildObj3 を選択して削除するとします。最初に ChildObj1 を削除すると、ChildObj3 の QModelIndex が変更されます (行が異なります)。親オブジェクトを削除すると、同様の問題が発生します (ただし、オブジェクトのリストから子を「プルーニング」することでこれを修正しました)。

このインターフェイスの制限を回避するために私が考えた方法は次のとおりですが、先に進む前に、より良い方法を求めることにしました。

  1. 提供された QModelIndices のリストが上から下に並べられていると仮定して、「後方」に移動します。これには、ソートが信頼できるものであることが本当に必要であり、ソートはおそらく素朴で遅いものになるでしょう (QModelIndexes のコレクションをソートするスマートな方法があるかもしれませんか? または、QItemSelectionModel は適切な (順序付けられた) リストを提供しますか?)

  2. オブジェクトが削除/追加されるたびに他の QModelIndeces を更新します (非単純な解決策を考えることはできません。リストを検索し、必要に応じて新しい QModelIndeces を取得してください)。

  3. 実際のデータの更新は簡単なので、データを更新してモデルを再構築するだけです。これはグロテスクに思えますが、大規模なデータ セットでは非常に遅くなることは想像に難くありません。

それらは私が現在持っているアイデアです。現在、オプション 1 に取り組んでいます。

よろしく、 ダン・オー

4

2 に答える 2

4

beginRemoveRows / endRemoveRowsなどは、ビューを更新する方法ではなく、QAbstractItemModel基本クラスに永続モデルインデックスを修正するように要求するメソッドと考えてください。これらのインデックスでの作業でQAbstractItemModel基本クラスを混同しないようにしてください。http://labs.trolltech.com/page/Projects/Itemview/Modeltestをチェックしてモデルを実行し、QAbstractItemModel基本クラスを満足させているかどうかを確認してください。

QPersistentModelIndexが役に立たないのは、元にした/やり直したデータをモデルの外部に保持したい場合です。大幅に編集されたモデルを作成しましたが、すべてをモデルに保持しようとはしませんでした。元にした/やり直したデータを元にしたスタックに保存します。問題は、列を編集し、その列の永続インデックスをUNDOスタックに格納してから、その列を保持している行を削除すると、その列の永続インデックスが無効になることです。

私がしていることは、永続的なモデルインデックスと「履歴」の通常のQModelIndexの両方を保持することです。元に戻す/やり直すときは、永続インデックスが無効になっていないか確認します。ある場合は、履歴QModelIndexをモデルの特別なメソッドに渡して、行、列、およびinternalPointerに基づいてインデックスを再作成するように依頼します。私の編集はすべて元に戻るスタックにあるので、元に戻るスタックでその列の編集にバックアップするまでに、行はモデルに必ず存在します。元のインデックスを再作成するのに十分な状態をinternalPointerに保持します。

于 2009-12-18T21:44:07.253 に答える
1

「全データ」モデルとフィルター プロキシ モデルをデータ モデルと共に使用することを検討します。データは全データ モデルに追加されるだけで、削除されることはありません。そうすれば、元に戻す/やり直す情報をそのモデルへの参照とともに保存できます。(提案してもQPersistentModelIndexいいですか?)。データモデルは、何を表示する必要があるかを追跡することもできます。フィルタ モデルは、特定の時間に表示する必要があるアイテムの情報のみを返します。

于 2009-11-12T18:24:32.633 に答える