2009-12-31 15 views
10

Estoy escribiendo una aplicación en Qt (con C++) y necesito representar una estructura de objeto en una vista de árbol. Una de las formas de hacerlo es crear un modelo para esto, pero aún estoy bastante confundido después de leer la documentación de Qt sobre el tema.Creando modelos Qt para vistas de árbol

La "estructura" que tengo es bastante simple - hay un objeto Project que contiene Task objetos en un contenedor std::vector. Estas tareas también pueden contener tareas secundarias.

Ya he escrito los métodos para leer & escribir estos proyectos en/desde archivos XML utilizando clases XML de Qt.

¿Hay más documentación o "lectura recomendada" para crear modelos desde cero? ¿Cómo recomiendas que empiece a implementar esto?

Respuesta

17

Para QTreeView novatos, el principal desafío es con la comprensión index() y parent(). He escrito un artículo sobre esto hace un tiempo:

http://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel.htm

El código de ejemplo es en Python, pero los principios permanecer igual.

+0

Virgil, esto es fantástico. Nunca recomendaré usar QStandardItemModels nuevamente. – andref

+0

Gracias Virgil, ahora tengo un árbol limpio, simple y reutilizable. –

9

como alternativa a lo que dijo Virgil, podría usar la clase QStandardItemModel para su modelo y simplemente construir su árbol usando esta clase. A continuación se muestra un ejemplo:

QStandardItemModel* model = new QStandardItemModel(); 

QStandardItem* item0 = new QStandardItem(QIcon("test.png"), "1 first item"); 
QStandardItem* item1 = new QStandardItem(QIcon("test.png"), "2 second item"); 
QStandardItem* item3 = new QStandardItem(QIcon("test.png"), "3 third item"); 
QStandardItem* item4 = new QStandardItem("4 forth item"); 

model->appendRow(item0); 
item0->appendRow(item3); 
item0->appendRow(item4); 
model->appendRow(item1); 

ui->treeView->setModel(model); 

esperanza que esta ayuda, que se refiere a

3

El truco básico para conseguir este trabajo es realmente para obtener el modelo de estructura de datos de mapeo derecha. Algo que puede parecer difícil, pero no necesariamente.

Primero, usando QAbstractItemModel::createIndex para construir índices de modelo, puede hacer referencia a su propia estructura de datos a través del puntero o uint32 que puede agregar al índice, dependiendo de la instancia de createIndex que elija usar.

En segundo lugar, teniendo la estructura clara en mente (como parece tener), es bastante fácil escribir las funciones parent y index. La clave aquí es comprender que la raíz del modelo es una instancia sin QModelIndex. Es decir. QModelIndex::isValid() == false indica raíz.

En tercer lugar, si va varias columnas, recuerde que solo la primera columna tiene hijos.

En cuarto lugar, para verificar que haga las cosas de la manera esperada, utilice la clase ModelTest. Supervisa y verifica su modelo, para que pueda seguir las convenciones que esperan las clases de vista modelo Qt.

+0

Explicación simple y simple de la arquitectura del modelo. ¡Gracias! – satishgoda

Cuestiones relacionadas