2011-09-12 14 views
5

Tengo un problema con mi aplicación Qt/entrevista. Yo uso QTreeView para visualizar datos de árbol. Implementé mi propio modelo basado en QAbstractItemModel.Qt error "índices de modelos persistentes dañados" ¿por qué?

Recibo un siguiente error antes de la falla de la aplicación. Sucede a menudo después de agregar un nuevo registro.

¿Podría explicarme cuál es el significado de este error? ¿Qué es un QPersistentModelIndex? No estoy usando QPersistentModelIndex en mi código.

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

Gracias.

+0

usaste las señales layoutAboutToBeChanged y layoutChanged en tu modelo? –

Respuesta

5

QPersistentModelIndexes son (fila, columna, elemento principal) las referencias a los elementos que se actualizan automáticamente cuando los elementos a los que se hace referencia se mueven dentro del modelo, a diferencia del QModelIndex normal.
Por ejemplo, si inserta una fila, todos los índices persistentes existentes colocados debajo del punto de inserción tendrán su propiedad row incrementada en uno.

No puede usarlos directamente, pero QTreeView lo hace, para realizar un seguimiento de los elementos expandidos y los elementos seleccionados, por ejemplo.

Y para que estos índices persistentes se actualicen, debe llamar a las funciones QAbstractitemModel::beginInsertRows() y endInsertRows() alrededor de la (s) inserción (es) de fila real cuando agrega registros nuevos.

ver el final de la sección acerca de las clases del modelo de subclases para más detalles: http://doc.trolltech.com/latest/qabstractitemmodel.html#subclassing

me encontré con este método QAbstractItemModel::persistentIndexList y estoy preguntándose qué índices se debe devolver. Todos ellos ?
¿Debería este método devolver todos los nodos actualmente visibles en TreeView?

Ese método devuelve sólo los índices para los cuales un QPersistentIndexModel se creó y se encuentra todavía en el alcance (como una variable local, un miembro de la clase, o en un QList<QPersistentIndexModel> por ejemplo).

Los nodos ampliados o seleccionados no son necesariamente visibles en ese momento, por lo que no puede (y no debería de todos modos) asumir nada sobre para qué se usan estos índices persistentes.

sólo hay que mantenerlos actualizados, y usted sólo tendrá que utilizar persistentIndexList para grandes cambios en el modelo, como la clasificación (ver QTreeWidget modelo interno: QTreeModel::ensureSorted(link)), para pequeños cambios incrementales que tiene toda la beginXxxRows/beginXxxColumns and endXxxRows/endXxxColumns methods.

+0

Gracias por responder :) Encontré este método QAbstractItemModel :: persistentIndexList y me pregunto qué índices debería devolver. Todos ellos ?? –

+0

Es decir, este método debería devolver todos los nodos actualmente visibles en TreeView. ¿O hay alguna otra regla? –

+1

@David Completé mi respuesta para responder sus preguntas. – alexisdm

Cuestiones relacionadas