logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

[Qt] QSettings 클래스의 설명과 사용법, 설정 저장위치

by digipine posted Nov 02, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
QSettings에 대하여
QSettings 클래스는 플랫폼 독립적인 어플리케이션의 설정을 지속적으로 저장할 수 있도록 도와줍니다. 
대부분의 사용자는 윈도우 사이즈나 위치, 그리고 옵션등과같은 프로그램의 설정이 자동으로 저장되어, 다음 실행시에도 그 설정이 적용되기를 기대합니다. 이러한 설정들은 윈도우 환경에서는 시스템 레지스트리, 그리고 맥 OS X에서는 XML파일의 형태로 저장됩니다. 또한 유닉스 시스템에서는 표준이 성립되어있지 않기 떄문에 (KDE를 포함한)많은 프로그램은 INI 텍스트 파일의 형태로 설정을 저장합니다.
 
QSettings의 API는 QVariant에 기반하므로, QString, QRect, QImage와 같은 값(Value)기반의 자료형을 쉽게 저장할 수 있도록 도와줍니다. 단, 지속적이지 않은, 메모리 기반의 저장소를 원한다면 QMap<QString, QVariant>를 사용하는것을 권장합니다.
 
 
기본적인 QSettings 사용법
QSettings 객체를 생성할때에 개발자의 회사/기관명과, 개발 프로그램명을 반드시 기입하여야 합니다. 예를들어, 만약 프로그램명이 Star Runner이고, 회사명이 MySoft일 경우에 QSettings 객체는 다음과같이 생성되어야 합니다.
 
QSettings settings("MySoft", "Star Runner"); 
 
QSettings 객체는 스택이나 힙 상에서 생성될 수 있습니다. QSettings 객체의 생성과 소멸은 매우 빠르게 진행됩니다. 만약 QSettings 객체를 프로그램상의 여러 부분에서 사용하게 된다면, 아래 예와 같이, QCoreApplication::setOrganizationName() 과 QCoreApplication::setApplicationName(), 으로 미리 회사명과 프로그램명을 지정해준 후 기본 생성자를 호출하는 방법을 사용할 수 있습니다. 아래 예제에는 OrganizationDomain을 추가해 주었는데, 이렇게 인터넷 도메인이 설정이 되면 맥 OS X에서는 기관명대신 도메인명을 사용하게 됩니다. 그 이유는 MAC OS X에서는 프로그램을 구분하기 위하여 인터넷 도메인명을 사용하고, 만약 도메인명이 설정되지 않는경우엔 기관 명을 조작한 임의의 도메인명을 사용하여 프로그램을 구분하기 때문입니다. 자세한 사항은 아래의 '플랫폼 특정사항' 항을 살펴보세요.
 
QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
...
QSettings settings; 
 
QSettings는 프로그램 설정을 저장하며, 각각의 설정은 설정명(Setting's name; key)을 지정하는 QString과 설정값(value)을 저장하는 QVariant로 이루어집니다. 설정을 저장하기 위하여 아래와 같이 setValue()를 사용합니다. 
 
settings.setValue("editor/wrapMargin", 68); 
 
만약 이미 동일한 설정명이 존재한다면, 기존의 설정값은 새로운 값으로 대체됩니다. 효용성을 위하여, 이 변화는 (레지스트리, INI 파일등과 같은 저장소에)즉각적으로 기록되지는 않을것입니다. 만약 이 변화를 기록하고 싶다면 언제든 sync()를 호출하여 기록할 수 있습니다.
 
설정값을 불러올때는 아래와 같이 value()를 호출합니다. 
 
int margin = settings.value("editor/wrapMargin").toInt(); 
 
만약 지정된 이름으로 설정을 검색할 수 없다면, QSettings는 null QVariant(이는 integer 0으로 변환될 수 있습니다)를 반환합니다. 또한 기본 값을 value()의 두번째 인자에 넣음으로서 설정값을 가져오지 못할경우를 대비할 수 있습니다.
 
int margin = settings.value("editor/wrapMargin", 80).toInt(); 
 
주어진 이름이 존재하는지 확인하려면 contains()를 호출합니다. 특정 이름에 해당하는 설정을 삭제하려면 remove()를 사용합니다. 모든 항목에 대한 리스트를 가져오려면 allKeys()를 호출하고 모든 항목을 삭제하려면 clear()를 호출합니다. 
 
 
Fallback Mechanism
MySoft라는 회사명과 Star Runner라는 프로그램명으로 QSettings 객체를 생성했다고 가정합시다. 특정 값을 불러올떄, 최대 4곳의 저장소가 차례대로 검색되어 이 값을 찾습니다. 각각의 플랫폼에 대한 저장소의 위치를 보려면 아래의 '플랫폼 특정사항' 항을 확인하세요.
 
1. Start Runner 프로그램을 위한 사용자기반의 저장소
2. MySoft 회사에서 만든 모든 프로그램을 위한 사용자기반의 저장소 
3. Star Runner 프로그램을 위한 시스템 저장소
4. MySoft 회사에서 만든 모든 프로그램을 위한 시스템 저장소
 
만약 처음(1번) 위치에서 특정값을 불러올 수 없는경우, 두번째 저장소에서 그 값을 찾습니다. 그리고 마찬가지일경우 찾을떄까지 차례대로 검색하빈다. 이 기능을 통하여 시스템 전반적으로 사용해야 할, 그리고 제작사에서 만든 프로그램에서 전반적으로 사용해야 할 값들을 적절히 저장하고, 또한 이와 동시에 사용자별, 프로그램별 설정을 저장 및 사용(Override)할 수 있도록 합니다. 이 기능을 사용하지 않으려면 setFallbacksEnabled(false)를 호출할 수 있습니다.
 
비록 위의 4개의 저장소 모두에서 설정을 읽어올 수 있지만, 가장 처음 위치에 있는 파일에만 기록을 할 수 있습니다. 다른 위치에 설정을 저장하기 위해서는 프로그램 명을 지정하지 않으면 됩니다. 또한 필요하다면 QSettings::SystemScope를 지정합니다. (QSettings::UserScope가 기본값임) 아래의 예제를 참고하세요.
 
QSettings obj1("MySoft", "Star Runner");
QSettings obj2("MySoft");
QSettings obj3(QSettings::SystemScope, "MySoft", "Star Runner");
QSettings obj4(QSettings::SystemScope, "MySoft"); 
 
아래의 표는 위의 4개의 객체가 어느 저장소에 접근하는지 보여줍니다. "X"로 표시된 저장소는 QSettings 객체의 기본 저장소의 위치로서 읽기/쓰기가 가능하며, "O"로 표시된 저장소는 읽기전용으로 fallback 메카니즘이 사용되는 저장소임을 의미합니다.
 
 저장소 위치 obj1 obj2  obj3  obj4 
 1. 사용자&프로그램기반  X      
 2. 사용자&제작사기반  O  X    
 3. 시스템&프로그램기반  O    X  
 4. 시스템&제작사기반  O  O  O  X
 
 
이 메카니즘의 장점은 특정 파일이름이나 레지스트리 경로를 지정하지 않고도 Qt에 의해 지원되는 모든 플랫폼에서 이 기능을 사용할 수 있다는 것입니다. 만약 기본 API를 사용하는것 대신 INI파일을 사용하길 원한다면(물론 플랫폼에 구애받지 않고) 아래와같이 QSettings::IniFormat 항목을 QSettings 생성자에 첫번째 인자로 넣을 수 있습니다. 
 
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "MySoft", "Star Runner"); 
 
 
플랫폼 특정사항
Fallback Mechanism 항에서 언급했듯, QSettings는 최대 4곳의 저장소에 프로그램 설정을 저장합니다. 제작사명을 MySoft, 프로그램명을 Star Runner이라 가정하고 아래 예제를 정리하였습니다.
 
-기본 파일 형식(NativeFormat)을 사용할 경우.
유닉스 시스템 환경
 1.$HOME/.config/MySoft/Star Runner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)
 2.$HOME/.config/MySoft.conf (Qt for Embedded Linux: $HOME/Settings/MySoft.conf)
 3./etc/xdg/MySoft/Star Runner.conf
 4./etc/xdg/MySoft.conf
 
Mac OS X 버전 10.2, 10.3 환경
 1.$HOME/Library/Preferences/com.MySoft.Star Runner.plist
 2.$HOME/Library/Preferences/com.MySoft.plist
 3./Library/Preferences/com.MySoft.Star Runner.plist
 4./Library/Preferences/com.MySoft.plist
 
윈도우에서는 다음의 레지스트리 위치에 설정을 저장합니다
 1.HKEY_CURRENT_USER\Software\MySoft\Star Runner
 2.HKEY_CURRENT_USER\Software\MySoft
 3.HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
 4.HKEY_LOCAL_MACHINE\Software\MySoft
 * WOW64모드에서 32비트 프로그램을 실행한다면 다음에 저장됨 : HKEY_LOCAL_MACHINE\Software\WOW6432node
 
-파일 형식을 IniFormat으로 지정한 경우 
유닉스 시스템과 Mac OS X 환경
 1.$HOME/.config/MySoft/Star Runner.ini (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.ini)
 2.$HOME/.config/MySoft.ini (Qt for Embedded Linux: $HOME/Settings/MySoft.ini)
 3./etc/xdg/MySoft/Star Runner.ini
 4./etc/xdg/MySoft.ini
 
윈도우 환경:
 1.%APPDATA%\MySoft\Star Runner.ini
 2.%APPDATA%\MySoft.ini
 3.%COMMON_APPDATA%\MySoft\Star Runner.ini
 4.%COMMON_APPDATA%\MySoft.ini
 * %APPDATA% 위치는 대개 다음으로 설정된다 C:\Documents and Settings\User Name\Application Data; 
 * %COMMON_APPDATA% 는 대개 다음으로 설정된다, C:\Documents and Settings\All Users\Application Data.
 
.ini와 .conf 파일들의 위치는 setPath()를 사용하여 변경할 수 있습니다. 또한 유닉스와 Mac OS X에서, XDG_CONFIG_HOME 환경변수를 변경하여 파일 위치를 변경할 수 있습니다. 자세한 사항은 setPath()를 참고하세요
TAG •

List of Articles
No. Subject Author Date Views
47 MacOS 10.12.2 (OSX) 보안 취약점 공격 기초 digipine 2017.11.02 8
46 MacOS 10.12.2 (OSX) 보안 취약점 공격 코드 2 file digipine 2017.11.02 3
45 MacOS 10.12.2 (OSX) 보안 취약점 공격 코드 digipine 2017.11.02 4
» [Qt] QSettings 클래스의 설명과 사용법, 설정 저장위치 digipine 2017.11.02 3
43 [Linux] ubuntu 16.04에 QT Creator 설치하기 digipine 2017.11.02 5
42 Phabricator 설치 가이드 우분투 16.04 기준 digipine 2017.11.02 5
41 Wi-Fi Display Standard Miracast Protocol Log digipine 2017.11.02 5
40 Git Http Backend Upload Size 설정 - Http 500 Error 해결 digipine 2017.11.02 3
39 [Linux, OSX] pfctl - Packet FIlter Control 사용법 digipine 2017.11.02 4
38 IPv6 프로그래밍 가이드 digipine 2017.11.02 2
37 TCP/IP State Transition - TCP 스택 포팅 시 참조 file digipine 2017.11.02 1
36 Git Commnd 사용법 정리 digipine 2017.11.02 1
35 Git Commit 취소 관련 명령어 정리 1 digipine 2017.11.02 1
34 리눅스 커널의 Swap Memory에 대해서 digipine 2017.11.02 1
33 Linux Kernel 컴파일 및 Patch 방법 digipine 2017.11.02 1
32 XOR Encryption : 단순하면서도 강력한 암호/복호화 기법 digipine 2017.11.02 1
31 Phabricator 설치 가이드 우분투 12.04 기준 digipine 2017.11.02 1
30 Ubuntu Git - Latest Version Install digipine 2017.11.02 2
29 [ubuntu, 우분투] sendmail 설치 digipine 2017.11.02 2
28 JDK Install ubuntu digipine 2017.11.02 1
Board Pagination Prev 1 2 3 4 Next
/ 4