16.2. Codesnippers

Dit gedeelte behandelt codesnippers om de ontwikkeling van plug-ins te faciliteren.

16.2.1. Hoe een methode aan te roepen met een sneltoets

Voeg in de plug-in aan de initGui() toe

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)

Voeg aan unload() toe

self.iface.unregisterMainWindowAction(self.key_action)

De methode die wordt aangeroepen wanneer op CTRL+I wordt gedrukt

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

16.2.2. Hoe te schakelen tussen lagen

Er is een API om toegang te verkrijgen tot lagen in de legenda. Hier is een voorbeeld dat schakelt met de zichtbaarheid van de actieve laag

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. Hoe toegang te krijgen tot de attributentabel van geselecteerde objecten

 1def change_value(value):
 2    """Change the value in the second column for all selected features.
 3
 4    :param value: The new value.
 5    """
 6    layer = iface.activeLayer()
 7    if layer:
 8        count_selected = layer.selectedFeatureCount()
 9        if count_selected > 0:
10            layer.startEditing()
11            id_features = layer.selectedFeatureIds()
12            for i in id_features:
13                layer.changeAttributeValue(i, 1, value) # 1 being the second column
14            layer.commitChanges()
15        else:
16            iface.messageBar().pushCritical("Error",
17                "Please select at least one feature from current layer")
18    else:
19        iface.messageBar().pushCritical("Error", "Please select a layer")
20
21# The method requires one parameter (the new value for the second
22# field of the selected feature(s)) and can be called by
23change_value(50)

16.2.4. Interface voor plug-in in het dialoogvenster Opties

U kunt een aangepaste tab voor plug-ins Opties toevoegen aan Extra ► Opties. Dit heeft de voorkeur boven het toevoegen van een specifiek item voor het hoofdmenu voor opties van uw plug-in, omdat het alle instellingen voor de toepassing QGIS behoudt en instellingen voor de plug-in op één enkele plaats staan, wat gemakkelijk is voor gebruikers om te ontdekken en te navigeren.

De volgende snipper zal slechts een blanco tab voor de instellingen voor de plug-in toevoegen, die u kunt vullen met alle opties en instellingen, specifiek voor uw plug-in. U kunt de volgende klassen splitsen in verschillende bestanden. In dit voorbeeld voegen we twee klassen toe aan het hoofdbestand mainPlugin.py.

 1class MyPluginOptionsFactory(QgsOptionsWidgetFactory):
 2
 3    def __init__(self):
 4        super().__init__()
 5
 6    def icon(self):
 7        return QIcon('icons/my_plugin_icon.svg')
 8
 9    def createWidget(self, parent):
10        return ConfigOptionsPage(parent)
11
12
13class ConfigOptionsPage(QgsOptionsPageWidget):
14
15    def __init__(self, parent):
16        super().__init__(parent)
17        layout = QHBoxLayout()
18        layout.setContentsMargins(0, 0, 0, 0)
19        self.setLayout(layout)

Tenslotte voegen we de imports toe en passen de functie __init__ aan:

 1from qgis.PyQt.QtWidgets import QHBoxLayout
 2from qgis.gui import QgsOptionsWidgetFactory, QgsOptionsPageWidget
 3
 4
 5class MyPlugin:
 6    """QGIS Plugin Implementation."""
 7
 8    def __init__(self, iface):
 9        """Constructor.
10
11        :param iface: An interface instance that will be passed to this class
12            which provides the hook by which you can manipulate the QGIS
13            application at run time.
14        :type iface: QgsInterface
15        """
16        # Save reference to the QGIS interface
17        self.iface = iface
18
19
20    def initGui(self):
21        self.options_factory = MyPluginOptionsFactory()
22        self.options_factory.setTitle(self.tr('My Plugin'))
23        iface.registerOptionsWidgetFactory(self.options_factory)
24
25    def unload(self):
26        iface.unregisterOptionsWidgetFactory(self.options_factory)

Tip

Aangepaste labels toevoegen aan een dialoogvenster voor vector laag-eigenschappen

U kunt een soortgelijke logica toepassen om de aangepaste optie voor de plug-in toe te voegen aan het dialoogvenster voor de laageigenschappen met de klassen QgsMapLayerConfigWidgetFactory en QgsMapLayerConfigWidget.