跳转至

12 读取和存储设置⚓︎

此页上的代码段需要导入以下模块:

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

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

借助Qt和QGIS API可以保存和检索这些变量。对于每个变量,你应该选择一个用于访问变量的键——对于用户喜欢的颜色,你可以使用键“favourite_color”或任何其他有意义的字符串。建议为键的命名提供一些结构。

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

  • 全局设置: 它们绑定到特定计算机上的用户。QGIS本身存储了许多全局设置,例如,主窗口大小或默认捕捉容差。使用QgsSettings类处理设置,该类提供setValue()value()方法

在这里,你可以看到如何使用这些方法的示例:

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

def read():
    s = QgsSettings()
    mytext = s.value("myplugin/mytext", "default text")
    myint  = s.value("myplugin/myint", 123)
    myreal = s.value("myplugin/myreal", 2.71)
    nonexistent = s.value("myplugin/nonexistent", None)
    print(mytext)
    print(myint)
    print(myreal)
    print(nonexistent)

value()方法的第二个参数是可选的,如果没有,则返回默认值。

通过qgis_global_settings.ini文件在全局设置中预配置默认值,更多详情查看Deploying QGIS within an organization

  • 项目设置: 在不同项目之间有所不同,因此它们与项目文件相关联。以地图画布背景颜色或目标坐标参考系统(CRS)作为例子——白色背景和WGS84可能适用于一个项目,而黄色背景和UTM投影适用于另一个项目。

以下是一个用法示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
proj = QgsProject.instance()

# 存储值
proj.writeEntry("myplugin", "mytext", "hello world")
proj.writeEntry("myplugin", "myint", 10)
proj.writeEntry("myplugin", "mydouble", 0.01)
proj.writeEntry("myplugin", "mybool", True)

# 读取值(返回具有值的元组,和一个布尔状态,检索到的值是否可以转换到它的类型, string, an integer, a double and a boolean)
mytext, type_conversion_ok = proj.readEntry("myplugin", "mytext", "default text")
myint, type_conversion_ok = proj.readNumEntry("myplugin", "myint", 123)
mydouble, type_conversion_ok = proj.readDoubleEntry("myplugin", "mydouble", 123)
mybool, type_conversion_ok = proj.readBoolEntry("myplugin", "mybool", 123)
如你所见,writeEntry()方法用于许多数据类型(integer, string, list),但有几种方法可以读取设置值,而且必须为每种数据类型选择相应的一个。

  • 地图图层设置:这些设置与项目的图层实例相关。它们不与图层的基础数据源连接,因此如果你创建两个shapefile图层实例,则它们不会共享设置。设置存储在项目文件中,因此如果用户再次打开项目,则与图层相关的设置将再次存在。使用customProperty()方法检索给定设置的值,并可使用setCustomProperty()进行设置。
1
2
3
4
5
6
vlayer = QgsVectorLayer()
# 保存值
vlayer.setCustomProperty("mytext", "hello world")

# 再次读取(如果没有找到,则返回“default text”)
mytext = vlayer.customProperty("mytext", "default text")