4

行の動きが装飾されているソースモデルがあるとします

beginMoveRows()
endMoveRows()

(したがって、 を出力しlayoutChanged()ます)。

次に、ソース モデルの行をフィルター処理するように設定されたQSortFilterProxyModelインスタンスがあります。ソースからわかるように、ソース モデルのレイアウトの変更は、プロキシ モデルのそれぞれの再調整につながります (layoutChanged()シグナルをリッスンし、適切に調整するため)。

しかし、ドキュメントは次のようにしか言いません:

注: デフォルトでは、元のモデルが変更されるたびに、モデルはデータを動的に再ソートおよび再フィルタリングしません。この動作は、dynamicSortFilter プロパティを設定することで変更できます。

dynamicSortFilter : bool このプロパティは、ソース モデルの内容が変更されるたびに、プロキシ モデルが動的に並べ替えおよびフィルター処理されるかどうかを保持します。

私の質問:

  • (1)「元のモデルが変更されるたび」には、「行が元のモデル内で移動されたとき」が含まれますか
  • (2) その場合、プロキシ モデル内のアイテムの順序は、ソース モデルと同じであることが保証されています。
  • (3)開発中に上記の動作に依存した経験のある人はいますか?
  • (4) [追加の質問] QSortFilterProxyModel サブクラス内でソース モデルの行(AboutToBe)Moved シグナルを追跡し、そこで beginMoveRows/endMoveRows を呼び出すと (適切にマッピングされた行インデックスを使用して)、プロキシが台無しになるということは正しいですか? beginMoveRows/endMoveRows 呼び出しは、onLayoutChanged ソース モデルのシグナルを処理するときに QSortFilterProxyModel によって既に調整された永続的なインデックスを調整しようとしますか?

ありがとう。

4

1 に答える 1

3

コメントで言及された問題は、列の数または順序で遊んだ場合にのみ発生するように見えるため、モデルは影響を受けないと思います。

何が起こるかについての詳細な仕様は提供されていないため、唯一の代替手段はソースを調べて、将来のバージョンで変更されないことを期待することです. ソースを一瞥した後、あなたの質問に対する答えは次のとおりだと思います。

  • (1) はい、qt はlayoutChanged()andlayoutAboutToBeChanged()シグナルに応答し、インデックスを更新して独自のlayoutChanged()andを発行layoutAboutToBeChanged()しているため、行の移動に反応しています。
  • (2) はい、並べ替えを使用せず、フィルタリングのみを使用します。このような場合、Qt は内部マッピング全体を消去し、最初から再構築するため、データはソース モデルに表示されるとおりになります。もちろん、並べ替えを行うと、新しいデータが散らばってしまいます。同じ親内で行の並べ替えと移動を使用している場合、並べ替えられたモデルは変化を示さないことに注意してください。
  • (3) いいえ。qt のソースを読んで解釈しているだけです。提供された情報は無視してかまいません ;)
  • (4) はい、layoutChanged()すでに永続的なインデックスを更新しているため、再度更新しても問題が発生するだけです。
于 2012-09-03T23:09:58.197 に答える