많은 경우 플러그인에 몇몇 변수들을 저장해서 다음에 플러그인을 실행할 때 사용자가 변수를 입력하거나 선택할 필요가 없도록 하는 것이 유용합니다.
Qt 및 QGIS의 API를 통해 이 변수들을 저장하고 불러올 수 있습니다. 각 변수에 대해 해당 변수에 접근하는 데 사용될 키(key)를 선택해야 합니다. 사용자가 선호하는 색상의 경우 “favourite_color” 또는 다른 어떤 의미가 있는 문자열이라도 키로 사용할 수 있습니다. 키를 명명할 때 일종의 구조를 부여하는 것이 좋습니다.
다음과 같은 몇 가지 설정 유형들로 구분할 수 있습니다.
전역 설정 — 전역 설정은 특정 시스템의 사용자에게 종속됩니다. QGIS는 스스로 주요 창 크기나 스냅 허용치 기본값 같은 많은 전역 설정들을 저장합니다. Qt 프레임워크는 QSettings 클래스를 통해 직접 이 기능을 제공합니다. 기본적으로 이 클래스는 시스템의 “고유한” 설정 저장 방법으로 설정을 저장합니다. 즉 윈도우의 경우 레지스트리, Mac OS X의 경우 .plist 파일, 유닉스의 경우 .ini 파일로 저장합니다. 자세한 내용은 QSettings 문서 에 있으므로, 여기에서는 단순한 예시만 제공할 것입니다.
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")
myint = s.value("myplugin/myint", 123)
myreal = s.value("myplugin/myreal", 2.71)
value() 메소드의 두 번째 파라미터는 필수가 아니며, 넘겨준 설정 명칭에 대한 이전 값이 설정되지 않았을 때 사용할 기본값을 설정합니다.
프로젝트 설정 — 각각의 프로젝트에 따라 달라지므로 이 설정은 프로젝트 파일과 연결되어 있습니다. 예를 들어 맵 캔버스 배경색이나 대상 좌표계(CRS) 같은 설정 말입니다. 어떤 프로젝트의 경우 하얀색 배경과 WGS84가 적당할 수 있고, 다른 프로젝트의 경우 노란색 배경과 UTM 투영이 더 나을 수도 있으니까요. 다음 예시는 그 사용법입니다.
proj = QgsProject.instance()
# store values
proj.writeEntry("myplugin", "mytext", "hello world")
proj.writeEntry("myplugin", "myint", 10)
proj.writeEntry("myplugin", "mydouble", 0.01)
proj.writeEntry("myplugin", "mybool", True)
# read values
mytext = proj.readEntry("myplugin", "mytext", "default text")[0]
myint = proj.readNumEntry("myplugin", "myint", 123)[0]
코드를 보면 알 수 있듯이 모든 데이터 유형에 대해 writeEntry() 메소드가 사용되지만 설정 값을 다시 읽어 올 때는 여러 가지 메소드들이 있고, 각 데이터 유형에 따라 적절한 메소드를 선택해줘야 합니다.
맵 레이어 설정 — 이 설정은 어떤 프로젝트의 특정 맵 레이어 인스턴스와 연결됩니다. 이 설정이 레이어의 기저 데이터 소스와 연결되어 있지는 않습니다. 따라서 shapefile 하나에 대해 두 개의 맵 레이어 인스턴스를 생성할 경우 이 인스턴스들은 설정을 공유하지 않습니다. 프로젝트 파일 형태로 설정을 저장하기 때문에, 사용자가 다시 프로젝트를 열 경우 레이어와 관련된 설정이 그대로 남아 있을 것입니다. 이 기능은 QGIS 1.4 버전부터 추가되었습니다. 해당 API는 QSettings 클래스와 유사하게 QVariant 인스턴스를 받고 반환합니다.
# save a value
layer.setCustomProperty("mytext", "hello world")
# read the value again
mytext = layer.customProperty("mytext", "default text")