Cómo programar en un Plugin de QGIS una QgsFieldComboBox

Hace unos meses, cuando escribí sobre las clases Qgs…ComboBox de qgis.gui, hice referencia a la instanciación de una QgsFieldComboBox en un QDialog. Sin embargo, su utilidad radicaría en el hecho de que pudiese implementarse en un plugin de QGIS para obtener información de los atributos de una capa vectorial.

La información referida al vectorial y sus campos no debe estar supeditada a la ejecución del slot principal (botón OK) por lo que parte de ella debe programarse entre el método __init__ y el método run para que esté disponible desde el inicio. En run debe estar un slot que actualice automáticamente la QgsFieldComboBox, una vez que cambie la capa en la QgsMapLayerComboBox, para reflejar los nombres de los campos de la nueva capa y borrar los anteriores.

El nombre del campo en la QgsFieldComboBox se usaría como referencia para las diferentes consultas que pudieran hacerse con relación a los atributos de la capa.

El extracto del código del plugin que realiza lo anterior se encuentra a continuación:

.
.
.
    def __init__(self, iface):
.
.
.
        okBtn = self.dlg.okButton
        okBtn.connect(okBtn, SIGNAL("clicked()"), self.sql_function)
        
        self.wcbL = QgsMapLayerComboBox(self.dlg)
        self.wcbL.move(150,28)
        self.wcbL.setMinimumWidth(203)
        self.wcbL.setFilters(QgsMapLayerProxyModel.VectorLayer)
        
        self.wcbF = QgsFieldComboBox(self.dlg)
        self.wcbF.move(150,68)
        self.wcbF.setMinimumWidth(203)
.
.
.
    def select_layer_fields(self, vlayer):
        
        self.wcbF.setLayer(vlayer)
        field = self.wcbF.setLayer(vlayer)

    def sql_function(self):
        
        vlayer = self.wcbL.currentLayer()
        field = self.wcbF.currentText()
        print field

    def run(self):
        """Run method that performs all the real work"""
        vlayer = self.wcbL.currentLayer()
        self.wcbF.setLayer(vlayer)
        self.wcbL.layerChanged.connect(self.select_layer_fields)

        # show the dialog
        self.dlg.show()
.
.
.

Para probarlo, cargué los 3 vectoriales de la imagen siguiente:

plugin

ejecuté el plugin y verifiqué que los campos de la capa por defecto en la QgsMapLayerComboBox coincidían con los de la tabla de atributos; tal como se presenta en la imagen siguiente:

plugin2

Al cambiar la capa en la QgsMapLayerComboBox automáticamente cambian los campos en la otra Combo Box:

plugin3

Ahora solo resta probar la conexión al slot principal. Cuando se seleccionó el campo ‘area’ para el vectorial polygon5 y se hizo click en OK se imprimió el texto ‘area’. Al cambiar a polygon8 y seleccionar su campo ‘values’ el valor impreso fue ‘values’; tal como se corrobora en la imagen siguiente:

plugin4

Por tanto, el código funciona de la manera esperada.

Esta entrada fue publicada en Plugin, PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

2 respuestas a Cómo programar en un Plugin de QGIS una QgsFieldComboBox

  1. Pingback: Máximos, mínimos y número de registros para los campos obtenidos mediante una QgsFieldComboBox en un plugin de QGIS | El Blog de José Guerrero

  2. Pingback: Plugin de QGIS para producir vectoriales por selección de rasgos con base en consultas tipo SQL | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s