martes, 14 de noviembre de 2017

Cómo poblar una QTableWidget con items en PyQGIS

Las QTableWidget son objetos Qt que pueden ser incorporados fácilmente en los Dialog a través del QtDesigner. Una vez añadidas restaría añadirles funcionalidad permitiendo que las filas y columnas de éstas sean llenadas con información útil.

En el caso que se tratará aquí se tiene pensado añadir una QTableWidget empotrada dentro de una QTabWidget para desplegar el nombre y el tipo de capas que se encuentran en la interface de legendas de QGIS.

El diseño y la edición lucen como en la imagen siguiente:


Una vez añadidos estos elementos Qt al QDialog, a la plantilla principal del plugin (archivo *.py) se le añade el código siguiente; el cual permite poblar la filas y columnas de la QTableWidget según un arreglo matricial de datos. El número de filas corresponde a la longitud de la data y se determina dinámicamente y las columnas corresponden a los items que hemos añadido a la QTableWidget mediante el QtDesigner.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.
.
.
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QTableWidgetItem
.
.
.
    def add_action(
.
.
.
        expBtn = self.dlg.exportButton
        expBtn.connect(expBtn, SIGNAL("clicked()"), self.export)

        legend = self.iface.legendInterface()
        layers = legend.layers()
        
        data = [ [] for i in range(len(layers)) ]
        
        for i, layer in enumerate(layers):
            for j in range(2):
                data[i].append(layer.name())
                if layer.type() == QgsMapLayer.VectorLayer:
                    data[i].append('vector layer')
                if layer.type() == QgsMapLayer.RasterLayer:
                    data[i].append('raster layer')
        
        nb_row = len(data)
        nb_col = 2

        self.dlg.tableWidget.setRowCount(nb_row)
        self.dlg.tableWidget.setColumnCount(nb_col)

        for row in range (nb_row):
            for col in range(nb_col):
                item = QTableWidgetItem(str(data[row][col]))
                self.dlg.tableWidget.setItem(row, col, item)

        return action

    def initGui(self):.
.
.


Después de recargado y ejecutado el plugin se obtiene la visualización siguiente; tal como se esperaba.


No obstante, al plugin le faltaría actualizar la información de la QTableWidget cada vez que se añada o remueva una capa de la Interface de Leyendas. Para ello sólo se requiere adaptar el código que se encuentra en este post.

No hay comentarios: