12. قراءة الإعدادات وتخزينها

تلميح

تحتاج مقتطفات الشيفرة في هذه الصفحة إلى عمليات الاستيراد التالية إذا كنت خارج وحدة تحكم pyqgis:

1from qgis.core import (
2  QgsProject,
3  QgsSettings,
4  QgsVectorLayer
5)

كثيرًا ما يكون من المفيد أن تحفظ الإضافة بعض المتغيرات حتى لا يضطر المستخدم إلى إدخالها أو تحديدها مجددًا في المرة التالية التي تُشغَّل فيها الإضافة.

يمكن حفظ هذه المتغيرات واسترجاعها بمساعدة Qt وQGIS API. لكل متغير، عليك اختيار مفتاح يُستخدم للوصول إلى المتغير --- فللون المفضل لدى المستخدم يمكنك استخدام المفتاح "favourite_color" أو أي سلسلة نصية أخرى ذات معنى. ويُستحسن اعتماد بنية منظمة في تسمية المفاتيح.

يمكننا التمييز بين عدة أنواع من الإعدادات:

  • الإعدادات العامة --- وهي مرتبطة بالمستخدم على جهاز معين. يخزّن QGIS نفسه الكثير من الإعدادات العامة، مثل حجم النافذة الرئيسية أو مسافة الالتقاط الافتراضية. وتُدار الإعدادات باستخدام الصنف QgsSettings، من خلال الدالتين setValue() و value() على سبيل المثال.

    يمكنك هنا رؤية مثال على كيفية استخدام هذه الدوال.

     1def store():
     2  s = QgsSettings()
     3  s.setValue("myplugin/mytext", "hello world")
     4  s.setValue("myplugin/myint",  10)
     5  s.setValue("myplugin/myreal", 3.14)
     6
     7def read():
     8  s = QgsSettings()
     9  mytext = s.value("myplugin/mytext", "default text")
    10  myint  = s.value("myplugin/myint", 123)
    11  myreal = s.value("myplugin/myreal", 2.71)
    12  nonexistent = s.value("myplugin/nonexistent", None)
    13  print(mytext)
    14  print(myint)
    15  print(myreal)
    16  print(nonexistent)
    

    المعامل الثاني للدالة value() اختياري، ويحدد القيمة الافتراضية التي تُعاد إذا لم تكن هناك قيمة سابقة معيَّنة لاسم الإعداد المُمرَّر.

    لمعرفة طريقة لضبط القيم الافتراضية للإعدادات العامة مسبقًا عبر الملف qgis_global_settings.ini، راجع نشر QGIS داخل مؤسسة لمزيد من التفاصيل.

  • إعدادات المشروع --- تختلف من مشروع لآخر، ولذلك ترتبط بملف المشروع. ومن أمثلتها لون خلفية لوحة الخريطة أو نظام الإحداثيات المرجعي (CRS) الوجهة --- فقد تناسب الخلفية البيضاء وWGS84 مشروعًا ما، بينما تكون الخلفية الصفراء وإسقاط UTM أنسب لمشروع آخر.

    فيما يلي مثال على الاستخدام.

     1proj = QgsProject.instance()
     2
     3# store values
     4proj.writeEntry("myplugin", "mytext", "hello world")
     5proj.writeEntry("myplugin", "myint", 10)
     6proj.writeEntryDouble("myplugin", "mydouble", 0.01)
     7proj.writeEntryBool("myplugin", "mybool", True)
     8
     9# read values (returns a tuple with the value, and a status boolean
    10# which communicates whether the value retrieved could be converted to
    11# its type, in these cases a string, an integer, a double and a boolean
    12# respectively)
    13
    14mytext, type_conversion_ok = proj.readEntry("myplugin",
    15                                            "mytext",
    16                                            "default text")
    17myint, type_conversion_ok = proj.readNumEntry("myplugin",
    18                                              "myint",
    19                                              123)
    20mydouble, type_conversion_ok = proj.readDoubleEntry("myplugin",
    21                                                    "mydouble",
    22                                                    123)
    23mybool, type_conversion_ok = proj.readBoolEntry("myplugin",
    24                                                "mybool",
    25                                                123)
    

    كما ترى، تُستخدم الدالة writeEntry() مع أنواع بيانات كثيرة (عدد صحيح، سلسلة نصية، قائمة)، لكن توجد عدة دوال لقراءة قيمة الإعداد، ويجب اختيار الدالة المقابلة لكل نوع بيانات.

  • إعدادات طبقة الخريطة --- ترتبط هذه الإعدادات بنسخة معينة من طبقة الخريطة ضمن مشروع. وهي غير مرتبطة بمصدر البيانات الأساسي للطبقة، فإذا أنشأت نسختين من طبقة الخريطة لملف shapefile واحد، فلن تتشاركا الإعدادات. وتُخزَّن الإعدادات داخل ملف المشروع، فإذا فتح المستخدم المشروع مجددًا ستكون الإعدادات المتعلقة بالطبقة موجودة مرة أخرى. وتُسترجع قيمة إعداد معين باستخدام الدالة customProperty()، ويمكن تعيينها باستخدام الدالة setCustomProperty().

    1vlayer = QgsVectorLayer()
    2# save a value
    3vlayer.setCustomProperty("mytext", "hello world")
    4
    5# read the value again (returning "default text" if not found)
    6mytext = vlayer.customProperty("mytext", "default text")