16.2. مقتطفات الشيفرة¶
تلميح
تحتاج مقتطفات الشيفرة في هذه الصفحة إلى عبارات الاستيراد التالية إن كنت خارج وحدة تحكم pyqgis:
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
يعرض هذا القسم مقتطفات شيفرة لتسهيل تطوير الإضافات.
16.2.1. كيفية استدعاء دالة باختصار لوحة مفاتيح¶
في الإضافة، أضف إلى 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() أضف
self.iface.unregisterMainWindowAction(self.key_action)
الدالة التي تُستدعى عند الضغط على CTRL+I
def key_action_triggered(self):
QMessageBox.information(self.iface.mainWindow(),"Ok", "You pressed Ctrl+I")
من الممكن أيضًا السماح للمستخدمين بتخصيص اختصارات لوحة المفاتيح للإجراءات المتوفرة. ويتم ذلك بإضافة:
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. كيفية إعادة استخدام أيقونات QGIS¶
لأن أيقونات QGIS معروفة وتنقل رسالة واضحة للمستخدمين، قد ترغب أحيانًا في إعادة استخدامها في إضافتك بدلًا من رسم أيقونة جديدة وتعيينها. استخدم الدالة getThemeIcon().
مثلًا، لإعادة استخدام الأيقونة
mActionFileOpen.svg المتوفرة في مستودع شيفرة QGIS:
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() دالة أخرى لاستدعاء أيقونات QGIS. تجد أمثلة على استدعاء أيقونات السمة في الصور المضمّنة في QGIS - ورقة مرجعية.
16.2.3. واجهة الإضافة في نافذة حوار الخيارات¶
يمكنك إضافة تبويب خيارات مخصص لإضافتك إلى . وهذا أفضل من إضافة عنصر مخصص في القائمة الرئيسية لخيارات إضافتك، لأنه يُبقي جميع إعدادات تطبيق QGIS وإعدادات الإضافات في مكان واحد يسهل على المستخدمين اكتشافه والتنقل فيه.
سيضيف المقتطف التالي تبويبًا فارغًا جديدًا لإعدادات الإضافة، جاهزًا لتملأه بجميع الخيارات والإعدادات الخاصة بإضافتك. يمكنك تقسيم الأصناف التالية إلى ملفات مختلفة. في هذا المثال نضيف صنفين إلى الملف الرئيسي 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)
أخيرًا نضيف عبارات الاستيراد ونعدّل الدالة __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)
نصيحة
إضافة تبويبات مخصصة إلى نافذة حوار خصائص الطبقة
يمكنك تطبيق منطق مشابه لإضافة خيار الإضافة المخصص إلى نافذة حوار خصائص الطبقة باستخدام الصنفين QgsMapLayerConfigWidgetFactory و QgsMapLayerConfigWidget.
16.2.4. تضمين عناصر واجهة مخصصة للطبقات في شجرة الطبقات¶
إلى جانب عناصر ترميز الطبقة المعتادة المعروضة بجوار عنصر الطبقة أو أسفله في اللوحة Layers، يمكنك إضافة عناصر واجهة خاصة بك تتيح وصولًا سريعًا إلى بعض الإجراءات التي تُستخدم كثيرًا مع طبقة ما (إعداد التصفية، التحديد، النمط، تحديث طبقة بعنصر زر، إنشاء شريط تمرير زمني مبني على الطبقة، أو مجرد عرض معلومات إضافية عن الطبقة في تسمية نصية هناك، أو ...). تُتاح هذه العناصر المسماة عناصر الواجهة المضمّنة في شجرة الطبقات عبر التبويب Legend في خصائص كل طبقة على حدة.
ينشئ مقتطف الشيفرة التالي قائمة منسدلة في مفتاح الخريطة تعرض لك أنماط الطبقة المتاحة لها، مما يتيح التبديل السريع بين أنماط الطبقة المختلفة.
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)
ثم من تبويب خصائص Legend لطبقة معينة، اسحب Layer style chooser من Available widgets إلى Used widgets لتفعيل عنصر الواجهة في شجرة الطبقات. تُعرض العناصر المضمّنة دائمًا أعلى العناصر الفرعية لعقدة الطبقة المرتبطة بها.
إن أردت استخدام عناصر الواجهة من داخل إضافة مثلًا، فيمكنك إضافتها على النحو التالي:
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)