티스토리 뷰

C | C++

QSettings 클래스(QT C++)

야라바 2024. 3. 18. 11:02
728x90

QSettings 클래스는 QObject를 상속하는 기반 클래스로 사용자가 편리하게 다양한 설정을 저장하고 읽을 수 있도록 돕는다. 운영체제나 옵션에 따라 정보의 저장 위치가 달라질 수 있다.

 

참조 링크 : https://doc.qt.io/qt-5/qsettings.html

 

 

위의 그림은 응용 프로그램의 다양한 설정을 INI 파일 형식의 파일에 저장하고 있는 모습이다. 통상 섹션으로 나누어 다양한 정보를 저장하고 읽는데, QSettings 클래스는 이 과정을 편리하고 수행할 수 있도록 돕는다. 값의 설정과 읽기에  QVariant 클래스를 사용하므로 다양한 오브젝트를 부담 없이 저장하고 읽을 수 있다.

 

QSettings settings(((QApplication::applicationDirPath()) + "/" + m_MainWindow->PROJECT_NAME +".ini"), QSettings::IniFormat);
settings.beginGroup("INTERFACE");

settings.setValue("ToolBarMain", Pref_checkBox_ToolBarMain->isChecked());
settings.setValue("Commands", Pref_checkBox_Commands->isChecked());
settings.setValue("SplitMode", QString::number(Pref_comboBox_SplitMode->currentIndex())); 
settings.setValue("MainWindowSize", m_MainWindow->size());
settings.setValue("MainWindowPos", m_MainWindow->pos());
settings.setValue("CommandsSize", QSize(r.height(), r.width()));
settings.setValue("CommandsPos", QPoint(r.x(), r.y()));
settings.endGroup();

settings.beginGroup("RECENT-FILES");
settings.remove("");
settings.setValue("Files", QString::number(m_PageCtrl->recentFiles.count()));
for (int i = 0; i < m_PageCtrl->recentFiles.count() ; i++)
	settings.setValue(("File" + QString::number(i)), m_PageCtrl->recentFiles[i]);
settings.endGroup();

 

위의 코드는 INI 파일 형태로 설정 파일을 저장하고 있는 예제로 다양한 데이터 오브젝트를 setValue로 저장하도록 요구하면 QSettings 클래스가 알아서 저장해 준다. 연관 함수들은 다음과 같다.

 

QSettings(QString &fileName, QSettings::Format format)
QSettings(QSettings::Format format, QSettings::Scope scope, QString &organization) : 클래스 생성자

    여러 형태의 QSettings 클래스 생성자가 있지만 파일 형태를 지정하는 생성자는 위의 두 가지다.

    범위(scope)는 QSettings::UserScope, QSettings::SystemScope를 지정할 수 있고,

    형식은 QSettings::NativeFormat, IniFormat 등으로 지정할 수 있다.
    NativeFormat은 윈도우는 레지스트리, 맥은 CFPreferences, 리눅스/유닉스는 INI 파일로 저장한다.

QString group()

void beginGroup(const QString &prefix)

void endGroup() : 그룹(섹션) 조회 및 시작/닫기. 그룹은 계층적으로 구성할 수 있다.

    그룹을 닫지 않고 다시 그룹을 시작하면 현재 그룹에 하위 새 그룹을 시작한다는 의미이다.

QStringList childGroups()

QStringList allKeys()

QStringList childKeys() : 그룹 및 키 조회. 그룹 안으로 들어간 상태에서는 해당 그룹을 범위로 조회한다.

void clear()

void remove(const QString &key) : 전체 삭제 및 키 삭제. 현재 그룹의 모든 키 삭제는 remove("")로 수행

void setValue(const QString &key, const QVariant &value) : 지정한 키값 설정

    윈도우와 리눅스는 키의 대소문자를 동일하게 처리하지만 맥은 다르게 처리한다.

 

QFile file(((QApplication::applicationDirPath()) + "/" + m_MainWindow->PROJECT_NAME +".ini"));
if (!file.exists()) pref_ok = false; else pref_ok = true;
QSettings settings(((QApplication::applicationDirPath()) + "/" + m_MainWindow->PROJECT_NAME +".ini"), QSettings::IniFormat);
settings.beginGroup("INTERFACE");
Pref_checkBox_ToolBarMain->setChecked(settings.value("ToolBarMain", true).toBool());
m_MainWindow->updateMainToolBarVisible(Pref_checkBox_ToolBarMain->isChecked()); 
Pref_checkBox_Commands->setChecked(settings.value("Commands", true).toBool());
Pref_comboBox_SplitMode->setCurrentIndex(settings.value("SplitMode", 1).toInt());
m_MainWindow->resize(settings.value("MainWindowSize", QSize(480, 320)).toSize());
m_MainWindow->move(settings.value("MainWindowPos", QPoint(0, 45)).toPoint());
settings.endGroup();

 

위의 코드는 설정 파일을 읽는 예제로  QVariant 클래스를 사용하므로 원래의 값 형태로 사용하려면 값을 조회한 다음에 toBool(), toInt() 등과 같은 함수를 사용하고 있음을 주목할 필요가 있다. 기타 함수들은 다음과 같다.

 

QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) : 값 조회.

    리턴이 QVariant 임에 주의. 지정한 키에 해당하는 값이 없으면 지정한 기본값을 리턴한다.

void sync() : 실제 파일에 저장하지 않은 값이 있다면 파일에 저장하고, 파일이 바뀌었다면 메모리로 다시 로드한다.

 

 

728x90

'C | C++' 카테고리의 다른 글

QPainter 클래스(QT C++)  (0) 2024.03.24
QVariant 클래스(QT C++)  (0) 2024.03.19
QGraphicsItem 클래스(QT C++)  (0) 2024.03.14
QGraphicsScene 클래스(QT C++)  (0) 2024.03.13
QGraphicsView 클래스(QT C++)  (0) 2024.03.13