2011-09-12 21 views
5

Qt /インタビューアプリケーションに問題があります。 QTreeViewを使ってツリーデータを表示します。 QAbstractItemModelに基づいて独自のモデルを実装しました。Qtエラー "永続モデルインデックスが壊れています"なぜですか?

アプリケーションがクラッシュする前に次のエラーが発生します。私は新しいレコードを追加した後に頻繁に起こります。

このエラーの意味を教えてください。 QPersistentModelIndexとは何ですか? 私のコードでQPersistentModelIndexを使用していません。

ASSERT failure in QPersistentModelIndex::~QPersistentModelIndex: "persistent model indexes corrupted" 

ありがとうございます。

+0

モデルでlayoutAboutToBeChangedおよびlayoutChangedシグナルを使用しましたか? –

答えて

5

QPersistentModelIndexesは、通常のQModelIndexとは異なり、参照項目がモデル内で移動されたときに自動的に更新される項目への参照です(行、列、親)。
たとえば、1つの行を挿入すると、挿入ポイントの下にある既存のすべての永続インデックスに、rowプロパティが1つ増えます。

たとえば、直接使用することはできませんが、QTreeViewは、展開されたアイテムや選択したアイテムを追跡するために使用します。

これらの永続的なインデックスを更新するには、新しいレコードを追加するときに、実際の行の挿入前後で関数QAbstractitemModel::beginInsertRows()endInsertRows()を呼び出す必要があります。

は、詳細については、サブクラス化モデルクラスに関するセクションの最後を参照してください:http://doc.trolltech.com/latest/qabstractitemmodel.html#subclassing

私はこの方法QAbstractItemModel::persistentIndexListを発見し、私はそれが返す必要がありますどのようなインデックス 思ったんだけど。それらのすべて?
このメソッドは、TreeViewで現在表示されているすべてのノードを返しますか?この方法は、(例えば、ローカル変数、クラスのメンバとして、またはQList<QPersistentIndexModel>で)QPersistentIndexModelが作成されたインデックスのみを返し、スコープ内に依然としてあること

拡張または選択されたノードは現在必ずしも表示されているわけではないため、これらの永続インデックスの用途については何も想定できません。

あなたは彼らが最新の状態に保つために持っている、とあなただけの(QTreeWidget内部モデルを参照してください。QTreeModel::ensureSorted(link))をソートするように、モデルに大きな変化をpersistentIndexListを使用する必要があり、小さな増分変更のためにあなたはすべてのbeginXxxRows/beginXxxColumns and endXxxRows/endXxxColumns methodsを持っています。

+0

答えをありがとう:)私はこのメソッドQAbstractItemModel :: persistentIndexListを見つけたと私はそれが返す必要があるインデックスが不思議です。それらのすべて? –

+0

このメソッドは、TreeViewに現在表示されているすべてのノードを返す必要があります。それとも別のルールがありますか? –

+1

@David私はあなたの質問に答えるために私の答えを完了しました。 – alexisdm

関連する問題