sábado, 11 de enero de 2020

Plantilla para visualizar elementos de un QDialog con PyQGIS

Aunque con la Python Console es posible visualizar de manera independiente muchos de los diferentes elementos Qt presentes en QGIS, con muy pocas líneas de código también se puede crear una clase "plantilla" para incluir varios de ellos y visualizarlos a todos de manera simultánea antes de crear un plugin. La clase Dlg que se va a proponer a continuación emplea un objeto QDialog al cual se le incorpora una QgsComboBox y una QListWidget.

La Combo Box emplea un filtro para seleccionar sólo las capas vectoriales e imprimir en la QListWidget el nombre de los campos y seleccionarlos de manera múltiple activando el modo 'ExtendedSelection'. Cuando se selecciona otra capa vectorial en la Combo Box la función 'changed_layer' permite imprimir los campos correspondientes a la nueva capa y borrar los anteriores.

El código completo se incluye a continuación:

 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
from PyQt5.QtCore import Qt

class Dlg(QDialog):

    def __init__(self):
        QDialog.__init__(self)
        self.layout = QGridLayout(self)
        self.cb_layer = QgsMapLayerComboBox()
        self.cb_layer.setFilters(QgsMapLayerProxyModel.VectorLayer)
        self.cb_layer.layerChanged.connect(self.layer_changed)
        self.fields_list = QListWidget(self)
        self.fields_list.setSelectionMode(QListWidget.ExtendedSelection)
        if self.cb_layer.currentLayer() is not None:
            self.fields_list.addItems([f.name() for f in self.cb_layer.currentLayer().fields() ])
        self.layout.addWidget(self.cb_layer, 0, 0)
        self.layout.addWidget(self.fields_list, 1, 0)

    def layer_changed(self, layer):
        self.fields_list.clear()
        fields = [f.name() for f in layer.fields()]
        self.fields_list.addItems(fields)

w = Dlg()
w.setWindowFlags(Qt.WindowStaysOnTopHint)
w.show()

Al ejecutar el código anterior en la Python Console el resultado se observa en la imagen siguiente. El QDialog incluye la QgsComboBox y la QListWidget. Los campos impresos en la QlistWidget corresponden a la capa polygon8 donde se han seleccionado arbitrariamente algunos de ellos (resaltado en azul).



No hay comentarios: