2011-09-12 10 views
5

Ho un problema con la mia domanda Qt/intervista. Io uso QTreeView per visualizzare i dati dell'albero. Ho implementato il mio modello basato su QAbstractItemModel.Errore Qt "indici modello persistenti corrotti" perché?

Viene visualizzato un errore seguente prima del crash dell'applicazione. Succede spesso dopo aver aggiunto un nuovo record.

Potrebbe spiegarmi qual è il significato di questo errore. Che cos'è un QPersistentModelIndex? Non sto usando QPersistentModelIndex nel mio codice.

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

Grazie.

+0

hai utilizzato i segnali layoutAboutToBeChanged e layoutChanged nel tuo modello? –

risposta

5

QPersistentModelIndexes sono riferimenti (riga, colonna, padre) agli elementi che vengono aggiornati automaticamente quando gli elementi di riferimento vengono spostati all'interno del modello, diversamente dal normale QModelIndex.
Ad esempio, se si inserisce una riga, tutti gli indici persistenti esistenti posizionati sotto il punto di inserimento avranno la loro proprietà row incrementata di uno.

Non è possibile utilizzarli direttamente, ma lo è QTreeView, per tenere traccia degli elementi espansi e degli elementi selezionati, ad esempio.

E per questi indici persistenti da aggiornare, è necessario chiamare le funzioni QAbstractitemModel::beginInsertRows() e endInsertRows() attorno agli inserimenti di riga effettivi quando si aggiungono nuovi record.

vedere la fine della sezione sulle classi modello subclassing per i dettagli: http://doc.trolltech.com/latest/qabstractitemmodel.html#subclassing

Ho trovato questo metodo QAbstractItemModel::persistentIndexList e sono chiedendo cosa gli indici deve restituire. Tutti loro ?
Questo metodo dovrebbe restituire tutti i nodi attualmente visibili in TreeView?

Tale metodo restituisce solo gli indici per cui un QPersistentIndexModel stata creata ed è ancora portata (come variabile locale, un membro della classe, o in un QList<QPersistentIndexModel> per esempio).

I nodi espansi o selezionati non sono necessariamente attualmente visibili, quindi non è possibile (e non dovrebbe comunque) assumere nulla riguardo a ciò per cui vengono utilizzati questi indici persistenti.

Devi solo per tenerli aggiornati, e avete solo bisogno di usare persistentIndexList per i grandi cambiamenti nel modello, come l'ordinamento (vedi QTreeWidget modello interno: QTreeModel::ensureSorted(link)), per le modifiche incrementali più piccoli di avere tutte le beginXxxRows/beginXxxColumns and endXxxRows/endXxxColumns methods.

+0

Grazie per la risposta :) Ho trovato questo metodo QAbstractItemModel :: persistentIndexList e mi chiedo quali indici dovrebbe restituire. Tutti loro ?? –

+0

Voglio dire questo dovrebbe restituire tutti i nodi attualmente visibili nel TreeView. O c'è qualche altra regola? –

+1

@David Ho completato la risposta per rispondere alle tue domande. – alexisdm