2011-08-12 42 views
5

Tengo una cantidad de artículos en un QTreeView. Cada elemento se genera utilizando esta clase:Obteniendo el elemento seleccionado actualmente en QTreeView

class Branch(QStandardItem): 
    def __init__(self, label, uri = None): 
     QStandardItem.__init__(self, label) 
     self.uri = uri 

Ésta es mi árbol real:

class FileTree(QTreeView): 
    def __init__(self): 
     QTreeView.__init__(self) 
    def keyPressEvent(self, event): 
     if event.key() == Qt.Key_Space or event.key() == Qt.Key_Return: 
      crawler = self.selectedIndexes()[0].model().item(self.selectedIndexes()[0].row()) 
      print(crawler.uri) 
     QTreeView.keyPressEvent(self, event) 

Como se puede ver, estoy un poco inseguro en cuanto a cómo conseguir la variable URI del seleccionado ít. Encontré que selectedIndexes() devuelve un modelo y no el artículo en sí. No estoy seguro de cómo pasar de uno a otro. Tratar de obtener el número de artículo usando self.selectedIndexes()[0].row() fue un poco difícil en la oscuridad, pero parece ignorar las diversas ramas en el árbol (por ejemplo, me dará un 0 para la primera fila en una rama, pero ganó ' t dime nada sobre en qué rama se encuentra).

¿Cuál es la forma correcta de obtener el elemento seleccionado de QTreeView? ¿O hay una forma mejor de detectar la barra espaciadora o devolver las teclas que podrían facilitar esto? Hay una falta grave de documentación de Python para Qt, por lo que es realmente difícil saber si alguna vez hago las cosas de manera sensible.

Respuesta

5

Está llamando a la función de la derecha, que en realidad devuelve un QModelIndexList que es sólo un typedef para QList<QModelIndex> con el QModelIndex siendo la estructura de datos que puede apuntar a cualquier parte del árbol. QModelIndex no es un Modelo en el sentido de Model View Controller (MVC) sino una dirección de un objeto en un QAbstractItemModel que es la estructura de datos en todos los objetos ItemView de Qt, incluido su árbol. De hecho, estás muy cerca, QAbstractModelIndex consiste en una fila, una columna y un elemento principal, que le permite dirigirse a cualquier posición en una estructura de datos jerárquica. Si utiliza la línea

index = self.selectedIndexes()[0] 
crawler = index.model().itemFromIndex(index) 

debe encontrar el objeto que busca.

En cuanto a la documentación, aunque no hay documentación específica de Python, ayuda a leer la documentación oficial de Qt, la jerarquía de clases y la funcionalidad siguen siendo las mismas. Hay muy poca información específica de C++ en los documentos.

+0

impresionante - eso es exactamente lo que estaba buscando. Esto es lo primero que he hecho en Qt. Gracias por tomarse el tiempo para explicarlo. – ashground

0

La respuesta de Harald no funcionó para mí, porque estoy usando un QSqlQueryModel como modelo (recibí el error {AttributeError}'QSqlQueryModel' object has no attribute 'itemFromIndex').

La continuación hizo el truco para mí, sin embargo, para obtener los datos 0 ª columna de la fila seleccionada:

dbQueryModel.itemData(treeView.selectedIndexes()[0]) 
Cuestiones relacionadas