3 votos

No se puede ejecutar la función cuando el elemento está seleccionado en el comboBox. Pyqgis. QGIS

Estoy escribiendo un plugin, quiero cambiar el contenido de un comboBox (campos) dependiendo del contenido de otro comboBox (capas).

Mi plugin es un dockwidget. Puedo rellenar los campos comboBox simplemente iniciando el plugin en el def run(self): y funciona bien:

        layerNom = self.dockwidget.comboBoxErrores.currentText()#Get the text value of the comboBox
        for lyr in QgsMapLayerRegistry.instance().mapLayers().values():    #Get layers        
            if lyr.name()==str(layerNom): 
                fields = lyr.pendingFields() #Get Fiels
                field_names = [field.name() for field in fields] #Field List
                self.dockwidget.comboCampos.addItems(field_names) #Added to the comboBox

Pero cuando intento actualizar el contenido de los campos comboBox realmente no sé cómo hacerlo.

En mi archivo "pluginName_dockwidget.py", en la sección init he creado la conexión con la función que repoblará el comboBox con el nuevo contenido:

self.comboBoxErrores.currentIndexChanged['QString'].connect(self.pueblaCampos)

En el mismo archivo tengo una función que obtiene el valor del nombre de la capa del comboBox y lo emite con la señal creada anteriormente:

sennalComboIndex = pyqtSignal(str)
.
.
.
def pueblaCampos(self):      

    layerName = self.comboBoxErrores.currentText()
    self.sennalComboIndex.emit(layerName)

En mi archivo principal, tengo el resto de la función:

def pueblaCampos(self, layerName):        

    for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
        if lyr.name()==str(layerName):
            fields = lyr.pendingFields()
            field_names = [field.name() for field in fields]             
            self.dockwidget.comboCampos.clear()
            self.dockwidget.comboCampos.addItems(field_names)

Cuando cambio el elemento seleccionado en el comboBox de capas, no ocurre nada. ¿Qué me falta?

2voto

Yada Puntos 9489

Si está programando en PyQGIS debe utilizar QgsMapLayerComboBox y QgsFieldComboBox objetos. Es más fácil y directo. Por ejemplo, el siguiente código recortado (de mi plugin):

.
.
.
    def __init__(self, iface):
.
.
.
        okBtn = self.dlg.okButton
        okBtn.connect(okBtn, SIGNAL("clicked()"), self.my_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 my_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()
.
.
.

puede hacer el trabajo. He probado con las siguientes tres capas vectoriales:

enter image description here

Después de seleccionar polígono8 vectorial, se puede observar que los campos de su tabla de atributos son los mismos que en el QgsFieldComboBox objeto.

enter image description here

Después de seleccionar polígono5 capa vectorial, los campos cambian automáticamente para mostrar los de esta nueva capa; como se puede observar en la siguiente imagen:

enter image description here

Para corroborar que funciona bien, la ranura mi_función (conectado al botón OK) tiene una instrucción para imprimir la referencia de los campos en la consola de Python de QGIS después de hacer clic en el botón OK. Se pudo observar para los campos "área" y "valores" de polígono8 en la siguiente imagen:

enter image description here

2voto

Hameno Puntos 129

Como he señalado en mi comentario, añada sus declaraciones .connect al initGui() función. Esto permitirá que la señal se escuche en cualquier evento de conexión.

0voto

Anand Puntos 106

Para aclarar lo que hice, voy a responder yo mismo. Sólo necesitaba una línea que conectara la señal emitida por el pluginName_dockwidget.py archivo a pluginName.py en el initGui() función.

esta es la línea:

self.dockwidget.sennalComboIndex.connect(self.pueblaCampos)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X