Часто бывает полезным сохранить некоторые параметры расширения, чтобы пользователю не приходилось заново вводить или выбирать их при каждом запуске расширения.
Эти параметры можно сохранять и получать при помощи Qt и QGIS API. Для каждого параметра необходимо выбрать ключ, который будет использоваться для доступа к переменной — так, для предпочитаемого цвета можно использовать ключ “favorite_color” или любую другую подходящую по смыслу строку. Рекомендуется придерживаться некоторой системы в именовании ключей.
Необходимо различать следующие типы настроек:
глобальные настройки — они свои для каждого пользователя компьютера. QGIS сама хранит множество глобальных настроек, например, размер главного окна или порог прилипания. Эта функциональность обеспечивается Qt, точнее входящим в ее состав классом QSettings. По умолчанию, этот класс хранит настройки в “родном” для системы виде — реестр (для Windows), файл .plist (на Mac OS X) или .ini файл (в Unix). Описание QSettings documentation достаточно обширное, поэтому ограничимся простым примером:
def store():
s = QSettings()
s.setValue("myplugin/mytext", "hello world")
s.setValue("myplugin/myint", 10)
s.setValue("myplugin/myreal", 3.14)
def read():
s = QSettings()
mytext = s.value("myplugin/mytext", "default text").toString()
myint = s.value("myplugin/myint", 123).toInt()[0]
myreal = s.value("myplugin/myreal", 2.71).toDouble()[0]
Qt использует экземпляры QVariant для значений переменных в методах setValue() и value(). Значения переменных автоматически конвертируются из переменных Python в экземпляры QVariant, однако обратное преобразование из QVariant в Python таковым не является: поэтому используются методы to*(). Также обратите внимание на следующие моменты:
настройки проекта разные для каждого проекта и поэтому они связаны с файлом проекта. Примером могут служить цвет фона карты и используемая система координат (CRS) — в одном проекте может быть белый фон и WGS84, а в другом желтый фон и проекция UTM. Пример использования ниже:
proj = QgsProject.instance()
# сохранение значение
proj.writeEntry("myplugin", "mytext", "hello world")
proj.writeEntry("myplugin", "myint", 10)
# чтение значений
mytext = proj.readEntry("myplugin", "mytext", "default text")[0]
myint = proj.readNumEntry("myplugin", "myint", 123)[0]
Возможно, в дальнейшем класс QgsProject будет обновлен, с тем чтобы предоставлять API, похожее на класс QSettings. Из-за некоторых ограничений привязок Python сохранение чисел с плавающей запятой не возможно.
настройки слоя — эти настройки относятся к отдельному экземпляру слоя карты. Они не связаны с определеным источником данных слоя, поэтому если создано два экземпляра слоя из одного shape-файла, они не будут использовать эти настройки совместно. Настройки хранятся в файле проекта, поэтому при открытии проекта настройки слоя будут восстановлены. Этот функционал добавлен в QGIS v1.4. API похоже на используемое в QSettings — для чтения и записи настроек используются экземпляры QVariant:
# сохранить значение
layer.setCustomProperty("mytext", "hello world")
# прочитать значение
mytext = layer.customProperty("mytext", "default text").toString()