Pages: 1
- Sujet précédent - QGIS 2.14 / Python: Permettre la sélection d'un champ dans un plug-in - Sujet suivant
#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 !
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: 726
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
Pages: 1
- Sujet précédent - QGIS 2.14 / Python: Permettre la sélection d'un champ dans un plug-in - Sujet suivant