Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 25 April 2017 10:48

Thomas Gardes
Juste Inscrit !
Date d'inscription: 16 Oct 2016
Messages: 5

QGIS 2.14 / Python: Permettre la sélection d'un champ dans un plug-in

Bonjour à tous !

Je travaille actuellement sur un plug-in QGIS, que je développe en python à partir du plug-in "Plug-in Builder".
J'ai conçu une interface via Qt Designer, interface qui comporte une combo box destinée à afficher la liste des champs d'une couche vecteur, pour que l'utilisateur puisse sélectionner le champ de son choix.

Je parviens à récupérer l'ensemble des champs présents sur les couches vecteur du projet et à les ajouter dans la combo box, mais ce que je voudrais faire, c'est n'y afficher que les champs correspondant à ceux d'une couche choisie dans un champ précédent. C'est quelque chose assez courant dans les plug-in / outil QGIS, mais j'ai eu beau fouiller leur code, je peine à le ré-exploiter.

Pour exprimer un peu mieux ce que je souhaite, je joins une image extraite d'un outil de QGIS, que je souhaiterai imiter sur ce point : le premier champ sert à définir une couche parmi les couches ouvertes dans le projet, le second affiche les champs présents sur cette couche.

Du côté du code, celui que j'utilise pour les champs des couches vectorielles est le suivant :

Code:

       # get layers
        provider = listLayers[index].dataProvider() 
        fields = listLayers.fields() 
        listFieldNames = [field.name() for field in fields]
        
        # add fields names to combo box menu_field
        self.dlg.menu_field.addItems(listFieldNames)

Le code complet permettant de remplir le formulaire Qt Designer avec les différentes couches est, pour l'instant, le suivant :

Code:

def run(self, index):

        """Run method that performs all the real work"""
        # show the dialog
        self.dlg.show()
        
        #clear all combo boxes
        self.dlg.menu_mnt.clear()
        self.dlg.menu_temperature.clear()
        self.dlg.menu_mapuce.clear()
        self.dlg.menu_fraction.clear()
        
        
        #add layers to interface
        mapCanvas = self.iface.mapCanvas() #connect to map canvas
        layers = self.iface.legendInterface().layers() #get layers in project
        rasterList=[] # lists for diffents kinds of layer to use in dialog 
        pointList = []
        polyList = []
        listLayers = []

        for i in range (mapCanvas.layerCount()-1,-1,-1): #for each layer in map canvas 
            layer = layers[i]
            if layer.type() == QgsMapLayer.VectorLayer : #if layer is a vector    
                if layer.wkbType() == QGis.WKBPoint : #if vector is a point layer...
                    pointList.append(layer.name()) #...add it to point list...
                    listLayers.append(layer) #...and to another list to get fields names later
                else :
                    polyList.append(layer.name()) # if vector is line or polygon, add it to polygon list 
                    
            else :
                rasterList.append(layer.name()) #if layer is raster, add it to raster list 
        
        #add layers to combo box depending their types :
        self.dlg.menu_mnt.addItems(rasterList) #add raster to MNT combo box
        self.dlg.menu_temperature.addItems(pointList) #add points to temperature measures combo box 
        self.dlg.menu_vector.addItems(polyList) #add polygon to polygon layer combo box
        self.dlg.menu_fraction.addItems(rasterList) #add raster to land cover box 
        
        # get layers
        provider = listLayers[index].dataProvider() 
        fields = listLayers.fields() 
        listFieldNames = [field.name() for field in fields]
        
        # add fields names to combo box menu_field
        self.dlg.menu_field.addItems(listFieldNames)

Voilà, en espérant avoir été clair, merci par avance !


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Tue 25 April 2017 14:21

Thomas Gardes
Juste Inscrit !
Date d'inscription: 16 Oct 2016
Messages: 5

Re: QGIS 2.14 / Python: Permettre la sélection d'un champ dans un plug-in

Bon, problème finalement résolu grâce au post de Jospeh disponible à cette adresse, pour ceux que ça intéresse !

https://gis.stackexchange.com/questions … n-combobox

Hors ligne

 

#3 Tue 25 April 2017 18:13

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS 2.14 / Python: Permettre la sélection d'un champ dans un plug-in

bonjour,
Si je peux me permettre, utilise plutôt comme le souligne Étienne trimaille aka gustry sur le post que tu as mis en lien :
QgsMapLayerComboBox https://qgis.org/api/classQgsMapLayerComboBox.html
QgsFieldComboBox https://qgis.org/api/classQgsFieldComboBox.html

C'est prévu pour et ultra simple.

https://webgeodatavore.github.io/pyqgis … boBox.html

Dernière modification par lejedi76 (Tue 25 April 2017 18:16)

Hors ligne

 

Pied de page des forums

Powered by FluxBB