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

 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 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.

 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)

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

 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)

Tip

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.