2010-08-27 9 views
5

Tengo QTreeView con QSortFilterProxyModel entre la vista y QStandardItemModel para ordenar el árbol. Luego quiero actuar sobre los clics en la vista a través de la señal de clic().No se puede usar itemFromIndex en señal de QTreeView con QSortFilterProxyModel

El modelo/vista son de configuración similar a esto:

mymodel = new QStandardItemModel(5, 5, this); 
mysort = new MySortProxy(this); 
mysort->setSourceModel(mymodel); 
myview = new QTableView(this); 
myview->setSourceModel(mysort); 
connect(myview, SIGNAL(clicked(QModelIndex)), this, slot(clickAction(QModelIndex))); 

Esta configuración de todas las obras y ordena mis datos en la forma que yo quiero. Cuando hace clic en un elemento, se llama a la ranura clickAction() con el índice del elemento al que se hace clic. Luego intento obtener el elemento del índice en la ranura:

void myclass::clickAction(const QModelIndex &index) 
{ 
    QStandardItem *item = mymodel->itemFromIndex(index); 
} 

Sin embargo, itemFromIndex devuelve NULL.

Si elimino QSortFilterProxyModel y configuro el modelo directamente como modelo fuente en la vista, todo funciona perfectamente. Es decir.

myview->setSourceModel(mymodel); // was setSourceModel(mysort); 

mymodel-> itemFromIndex (índice) ahora vuelve el artículo como se esperaba, pero es evidente que ahora no puedo usar mi propio proxy de tipo.

¿Alguien puede decirme qué estoy haciendo mal y cómo puedo obtener el elemento en la ranura de clic cuando tengo un proxy de filtro de clasificación en su lugar?

Estoy usando Qt-4.3.1.

Gracias por cualquier ayuda, Giles

Respuesta

12

creo que quiere hacer algo como:

void myclass::clickAction(const QModelIndex &index) 
{ 
    QStandardItem *item = mymodel->itemFromIndex(mysort->mapToSource(index)); 
} 
+0

Muchas gracias por su respuesta. Lamentablemente, no puedo probar esto hasta el martes, ya que el lunes es un feriado bancario en Inglaterra. Sin embargo, tu respuesta suena un montón de campanas y estoy seguro de que será correcta, así que la marcaré como aceptada ahora. Lo actualizaré después de haberlo probado el martes. Gracias. – giles123

+0

He intentado esto ahora y funcionó bien. Gracias. – giles123