12. 读取和存储设置

提示

如果您在pyqgis控制台之外,则此页面上的代码片段需要以下导入:

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

很多时候,插件保存一些变量是有用的,这样用户就不必在下次运行插件时再次输入或选择它们。

这些变量可以通过Qt和QGISAPI进行保存和检索。对于每个变量,您应该选择一个将用于访问该变量的键-对于用户最喜欢的颜色,您可以使用键“Favorest_COLOR”或任何其他有意义的字符串。建议为键的命名提供一些结构。

我们可以区分几种类型的设置:

  • global settings -它们绑定到特定机器上的用户。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() 方法是可选的,并指定如果没有为传递的设置名称设置先前的值,则返回的默认值。

    方法来预配置全局设置的默认值。 global_settings.ini 文件,请参见 在组织内部署QGIS 了解更多细节。

  • project settings -在不同的项目之间有所不同,因此它们与一个项目文件相连。地图画布背景颜色或目的地坐标系(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() 方法用于许多数据类型(整型、字符串、列表),但有几种方法可以回读设置值,并且必须为每种数据类型选择相应的方法。

  • map layer settings -这些设置与具有项目的地图图层的特定实例相关。他们是 not 连接到一个层的底层数据源,所以如果您创建一个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")