Cibler une table attributaire spécifique

Oct 12 2020

Je suis nouveau sur PyQGIS et je suis coincé ici.

J'ai donc créé un ComboBox pour que l'utilisateur puisse sélectionner la couche avec laquelle il souhaite travailler. Tout va bien jusqu'à présent. J'ai également ajouté toutes les couches, mais j'ai maintenant des problèmes pour filtrer la sortie dans la 2ème ComboBox.


for layer in QgsProject.instance().mapLayers().values():
    self.dlg.ComboAll.addItem(layer.name())

self.dlg.ComboAll.currentIndexChanged.connect(IndexChange)

C'est ainsi que j'invite toutes les couches de ma ComboBox et j'obtiens les informations que l'utilisateur a choisi une autre option.


def IndexChange():
    selectedLayer = self.dlg.ComboAll.currentIndex()
    #Prompt every fields of selectedLayer in ComboLayer

Et c'est ainsi que j'obtiens le numéro du calque sélectionné. Mais je ne sais pas quoi faire après ça. Par exemple, si l'utilisateur choisit le calque numéro 3, je veux uniquement que les champs de ce calque apparaissent dans mon deuxième ComboBox.

Réponses

8 J.Monticolo Oct 12 2020 at 21:09

Ci-dessous un code avec un simple QDialogavec 2 comboBoxes (spécialisé pour QGIS pour afficher les couches et les champs):

class MyDialog(QDialog):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        self._combo_lyr = QgsMapLayerComboBox(self)
        self._combo_fld = QgsFieldComboBox(self)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.layout.addWidget(self._combo_lyr)
        self.layout.addWidget(self._combo_fld)
        # init fields data
        self.IndexChanged(0)
        # signals
        self._combo_lyr.currentIndexChanged.connect(self.IndexChanged)

    def IndexChanged(self, index):
        # see help(QgsMapLayerComboBox.layer)
        selected_layer = self._combo_lyr.layer(index)
        # see help(QgsMapLayerComboBox.layer)
        self._combo_fld.setLayer(selected_layer)
        self._combo_fld.setCurrentIndex(0)

md = MyDialog()
md.show()

QgsMapLayerComboBox

.layer ( auto , layerIndex: int) →QgsMapLayer

Renvoie le calque actuellement affiché à l'index spécifié dans la zone de liste déroulante.

  • source : Documentation de l'API PyQGISQgsMapLayerComboBox.layer

QgsFieldComboBox

.setLayer ( auto , couche: QgsMapLayer)

Définit le calque pour lequel les champs sont répertoriés dans la liste déroulante. Si aucune couche n'est définie ou si une couche non vectorielle est définie, la zone de liste déroulante sera vide.

  • source : Documentation de l'API PyQGISQgsFieldComboBox.setLayer