16.2. Extraits de code

Cette section contient des extraits de code pour faciliter le développement de plugins.

16.2.1. Comment appeler une méthode par un raccourci clavier

Dans le plug-in, ajoutez à la fonction initGui().

self.key_action = QAction("Test Plugin", self.iface.mainWindow())
self.iface.registerMainWindowAction(self.key_action, "Ctrl+I")  # action triggered by Ctrl+I
self.iface.addPluginToMenu("&Test plugins", self.key_action)
self.key_action.triggered.connect(self.key_action_triggered)

À unload() ajouter

self.iface.unregisterMainWindowAction(self.key_action)

La méthode qui est appelée lorsque l’on appuie sur CTRL+I

def key_action_triggered(self):
  QMessageBox.information(self.iface.mainWindow(),"Ok", "You pressed Ctrl+I")

16.2.2. Comment basculer les couches

Il existe une API pour accéder aux couches de la légende. Voici un exemple qui permet de basculer la visibilité de la couche active

root = QgsProject.instance().layerTreeRoot()
node = root.findLayer(iface.activeLayer().id())
new_state = Qt.Checked if node.isVisible() == Qt.Unchecked else Qt.Unchecked
node.setItemVisibilityChecked(new_state)

16.2.3. Comment accéder à la table d’attributs des entites sélectionnées

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def change_value(value):
    """Change the value in the second column for all selected features.

    :param value: The new value.
    """
    layer = iface.activeLayer()
    if layer:
        count_selected = layer.selectedFeatureCount()
        if count_selected > 0:
            layer.startEditing()
            id_features = layer.selectedFeatureIds()
            for i in id_features:
                layer.changeAttributeValue(i, 1, value) # 1 being the second column
            layer.commitChanges()
        else:
            iface.messageBar().pushCritical("Error",
                "Please select at least one feature from current layer")
    else:
        iface.messageBar().pushCritical("Error", "Please select a layer")

# The method requires one parameter (the new value for the second
# field of the selected feature(s)) and can be called by
change_value(50)

16.2.4. Interface pour le plugin dans le dialogue des options

Vous pouvez ajouter un onglet d’options de plugin personnalisé à Settings ► Options. Ceci est préférable à l’ajout d’une entrée spécifique dans le menu principal pour les options de votre plugin, car cela permet de garder tous les paramètres de l’application QGIS et les paramètres du plugin dans un seul endroit, ce qui est facile à découvrir et à naviguer pour les utilisateurs.

L’extrait suivant ajoute un nouvel onglet vierge pour les paramètres du plugin, prêt à être rempli avec toutes les options et paramètres spécifiques à votre plugin. Vous pouvez diviser les classes suivantes en différents fichiers. Dans cet exemple, nous ajoutons deux classes dans le fichier main mainPlugin.py.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class MyPluginOptionsFactory(QgsOptionsWidgetFactory):

    def __init__(self):
        super().__init__()

    def icon(self):
        return QIcon('icons/my_plugin_icon.svg')

    def createWidget(self, parent):
        return ConfigOptionsPage(parent)


class ConfigOptionsPage(QgsOptionsPageWidget):

    def __init__(self, parent):
        super().__init__(parent)
        layout = QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

Enfin, nous ajoutons les importations et modifions la fonction __init_ :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from qgis.PyQt.QtWidgets import QHBoxLayout
from qgis.gui import QgsOptionsWidgetFactory, QgsOptionsPageWidget


class MyPlugin:
    """QGIS Plugin Implementation."""

    def __init__(self, iface):
        """Constructor.

        :param iface: An interface instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
        :type iface: QgsInterface
        """
        # Save reference to the QGIS interface
        self.iface = iface


    def initGui(self):
        self.options_factory = MyPluginOptionsFactory()
        self.options_factory.setTitle(self.tr('My Plugin'))
        iface.registerOptionsWidgetFactory(self.options_factory)

    def unload(self):
        iface.unregisterOptionsWidgetFactory(self.options_factory)

Astuce

Ajouter des onglets personnalisés à la boîte de dialogue des propriétés d’une couche vecteur.

Vous pouvez appliquer une logique similaire pour ajouter l’option personnalisée du plugin au dialogue des propriétés de la couche en utilisant les classes QgsMapLayerConfigWidgetFactory et QgsMapLayerConfigWidget.