Viktigt
Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.
16.2. Kodsnuttar
Råd
Kodsnuttarna på den här sidan behöver följande import om du befinner dig utanför pyqgis-konsolen:
1from qgis.core import (
2 QgsProject,
3 QgsApplication,
4 QgsMapLayer,
5)
6
7from qgis.gui import (
8 QgsGui,
9 QgsOptionsWidgetFactory,
10 QgsOptionsPageWidget,
11 QgsLayerTreeEmbeddedWidgetProvider,
12 QgsLayerTreeEmbeddedWidgetRegistry,
13)
14
15from qgis.PyQt.QtCore import Qt
16from qgis.PyQt.QtWidgets import (
17 QMessageBox,
18 QAction,
19 QHBoxLayout,
20 QComboBox,
21)
22from qgis.PyQt.QtGui import QIcon
Detta avsnitt innehåller kodavsnitt som underlättar plugin-utveckling.
16.2.1. Hur man anropar en metod med en kortkommando
I plugin-programmet lägger du till 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)
Till unload()
lägg till
self.iface.unregisterMainWindowAction(self.key_action)
Den metod som anropas när CTRL+I trycks in
def key_action_triggered(self):
QMessageBox.information(self.iface.mainWindow(),"Ok", "You pressed Ctrl+I")
Det är också möjligt att låta användare anpassa kortkommandon för de åtgärder som tillhandahålls. Detta görs genom att lägga till:
1# in the initGui() function
2QgsGui.shortcutsManager().registerAction(self.key_action)
3
4# and in the unload() function
5QgsGui.shortcutsManager().unregisterAction(self.key_action)
16.2.2. Hur man återanvänder QGIS-ikoner
Eftersom de är välkända och förmedlar ett tydligt budskap till användarna kanske du ibland vill återanvända QGIS-ikoner i ditt plugin istället för att rita och ställa in en ny. Använd metoden getThemeIcon()
.
Till exempel för att återanvända ikonen mActionFileOpen.svg som finns i QGIS kodarkiv:
1# e.g. somewhere in the initGui
2self.file_open_action = QAction(
3 QgsApplication.getThemeIcon("/mActionFileOpen.svg"),
4 self.tr("Select a File..."),
5 self.iface.mainWindow()
6)
7self.iface.addPluginToMenu("MyPlugin", self.file_open_action)
iconPath()
är en annan metod för att anropa QGIS-ikoner. Du hittar exempel på anrop till temaikoner på QGIS embedded images - Cheatsheet.
16.2.3. Gränssnitt för plugin i dialogrutan för alternativ
Du kan lägga till en anpassad flik för insticksprogrammets alternativ i
. Detta är att föredra framför att lägga till en specifik huvudmenypost för ditt insticksprograms alternativ, eftersom det håller alla QGIS-applikationens inställningar och insticksprogrammets inställningar på ett enda ställe som är lätt för användare att upptäcka och navigera.Följande snippet kommer bara att lägga till en ny tom flik för plugin-inställningarna, redo för dig att fylla i alla alternativ och inställningar som är specifika för ditt plugin. Du kan dela upp följande klasser i olika filer. I det här exemplet lägger vi till två klasser i huvudfilen 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)
Slutligen lägger vi till importen och modifierar funktionen __init__
:
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)
Tips
Lägg till anpassade flikar i dialogen för lageregenskaper
Du kan tillämpa en liknande logik för att lägga till det anpassade alternativet för insticksprogrammet i dialogen med skiktegenskaper med hjälp av klasserna QgsMapLayerConfigWidgetFactory
och QgsMapLayerConfigWidget
.
16.2.4. Bädda in anpassade widgetar för lager i lagerträdet
Förutom de vanliga lagersymbologielementen som visas bredvid eller under lagerposten i panelen Layers kan du lägga till egna widgetar som ger snabb åtkomst till vissa åtgärder som ofta används med ett lager (konfigurationsfiltrering, urval, stil, uppdatering av ett lager med en knappwidget, skapa en lagerbaserad tidsregulator eller bara visa extra lagerinformation i en etikett där, eller …). Dessa så kallade Layer tree embedded widgets görs tillgängliga via skiktets egenskaper Legend-fliken för enskilda skikt.
Följande kodsnutt skapar en rullgardinsmeny i legenden som visar de lager-stilar som finns tillgängliga för lagret, så att du snabbt kan växla mellan de olika lager-stilarna.
1class LayerStyleComboBox(QComboBox):
2 def __init__(self, layer):
3 QComboBox.__init__(self)
4 self.layer = layer
5 for style_name in layer.styleManager().styles():
6 self.addItem(style_name)
7
8 idx = self.findText(layer.styleManager().currentStyle())
9 if idx != -1:
10 self.setCurrentIndex(idx)
11
12 self.currentIndexChanged.connect(self.on_current_changed)
13
14 def on_current_changed(self, index):
15 self.layer.styleManager().setCurrentStyle(self.itemText(index))
16
17class LayerStyleWidgetProvider(QgsLayerTreeEmbeddedWidgetProvider):
18 def __init__(self):
19 QgsLayerTreeEmbeddedWidgetProvider.__init__(self)
20
21 def id(self):
22 return "style"
23
24 def name(self):
25 return "Layer style chooser"
26
27 def createWidget(self, layer, widgetIndex):
28 return LayerStyleComboBox(layer)
29
30 def supportsLayer(self, layer):
31 return True # any layer is fine
32
33provider = LayerStyleWidgetProvider()
34QgsGui.layerTreeEmbeddedWidgetRegistry().addProvider(provider)
Dra sedan Layer style chooser
från Available widgets till Used widgets från ett visst lagers egenskapsflik Legend för att aktivera widgeten i lagerträdet. Inbäddade widgetar visas ALLTID högst upp i underobjekten i den tillhörande skiktnoden.
Om du vill använda widgetarna från t.ex. ett plugin kan du lägga till dem så här:
1layer = iface.activeLayer()
2counter = int(layer.customProperty("embeddedWidgets/count", 0))
3layer.setCustomProperty("embeddedWidgets/count", counter+1)
4layer.setCustomProperty("embeddedWidgets/{}/id".format(counter), "style")
5view = self.iface.layerTreeView()
6view.layerTreeModel().refreshLayerLegend(view.currentLegendNode())
7view.currentNode().setExpanded(True)