ご挨拶、
モデルからのオブジェクトの任意のセットの削除の取り消し/やり直しをサポートするために、厄介なコードを書いています。他のすべてのミューテーター (追加/コピー/貼り付け) はこの機能のサブセットであるため、これについては正しく行っているように感じます。
コードは私にとって必要以上に厄介です。主に、モデルを変更する唯一の方法は、beginInsertRows/beginRemoveRows を呼び出して範囲内の行を削除することです (一度に 1 行ずつ実行するだけで、「隣人」を単一に最適化する必要はありません)。まだ電話する)
beginInsertRows/beginRemoveRows の問題は、行の削除が別の QModelIndex (たとえば、リストにキャッシュされたもの) に影響を与える可能性があることです。例えば:
ParentObj
->ChildObj1
->ChildObj2
->ChildObj3
ChildObj1 と ChildObj3 を選択して削除するとします。最初に ChildObj1 を削除すると、ChildObj3 の QModelIndex が変更されます (行が異なります)。親オブジェクトを削除すると、同様の問題が発生します (ただし、オブジェクトのリストから子を「プルーニング」することでこれを修正しました)。
このインターフェイスの制限を回避するために私が考えた方法は次のとおりですが、先に進む前に、より良い方法を求めることにしました。
提供された QModelIndices のリストが上から下に並べられていると仮定して、「後方」に移動します。これには、ソートが信頼できるものであることが本当に必要であり、ソートはおそらく素朴で遅いものになるでしょう (QModelIndexes のコレクションをソートするスマートな方法があるかもしれませんか? または、QItemSelectionModel は適切な (順序付けられた) リストを提供しますか?)
オブジェクトが削除/追加されるたびに他の QModelIndeces を更新します (非単純な解決策を考えることはできません。リストを検索し、必要に応じて新しい QModelIndeces を取得してください)。
実際のデータの更新は簡単なので、データを更新してモデルを再構築するだけです。これはグロテスクに思えますが、大規模なデータ セットでは非常に遅くなることは想像に難くありません。
それらは私が現在持っているアイデアです。現在、オプション 1 に取り組んでいます。
よろしく、 ダン・オー