5

Qt/インタビュー アプリケーションに問題があります。QTreeView を使用してツリー データを表示します。QAbstractItemModel に基づいて独自のモデルを実装しました。

アプリケーションがクラッシュする前に、次のエラーが発生します。新しいレコードを追加した後によく発生します。

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

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

ありがとう。

4

1 に答える 1

7

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

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

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

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

このメソッドを見つけたのでQAbstractItemModel::persistentIndexList、どのインデックスを返す必要があるのか​​ 疑問に思っています。それらのすべて?
このメソッドは、現在 TreeView に表示されているすべてのノードを返す必要がありますか?

このメソッドは、QPersistentIndexModelが作成され、まだスコープ内にあるインデックスのみを返します (ローカル変数、クラス メンバーとして、またはQList<QPersistentIndexModel>たとえば a 内で)。

展開または選択されたノードは必ずしも現在表示されているとは限りません。そのため、これらの永続的なインデックスが何に使用されているかについて何も推測することはできません (とにかくすべきではありません)。

persistentIndexListそれらを最新の状態に保つ必要があり、ソートなどのモデルの大きな変更にのみ使用する必要があります(QTreeWidget内部モデルを参照してください:(QTreeModel::ensureSortedリンク))。小さな増分変更には、すべてのbeginXxxRows/beginXxxColumnsおよびendXxxRows/endXxxColumnsメソッドがあります。

于 2011-09-13T01:50:02.547 に答える