QSettingsを使用してQTアプリケーションデータを保存

4022 ワード

QSettingsを使用してQTアプリケーションデータを保存
概要
QSettingsクラスは持続的なプラットフォーム間アプリケーション設定を提供しています.これらのsettingsは一般的にシステムに存在します.例えば、windowsは一般的にシステムレジストリやINIファイルに書かれています.macシステムは一般的にXMLファイルに書かれています.一般的な基準では、多くのアプリケーションはINIファイルで実現されています.Qsettingsは、アプリケーションを格納および復元するための便利な方法を提供するsettingsです.
QSettingsのAPIはQvariantに基づいており、Qvariantはデータ型の集合であり、QString、QRec、QImageなどの一般的なQtデータ型の大部分を含む.
1.QSettings書き込みiniファイル
#include 
struct Login {
QString userName;
QString password;
};
void main(int argc, char *argv[])
{
    //    ini    
    QSettings settings("setting.ini", QSettings::IniFormat);
    //        
    settings.clear();
    settings.beginGroup("MAIN FILE INFO"); 
    //  setValue        
    settings.setValue("MAIN/FILE/INFO/exeTitle", "Test"); 
    settings.setValue("curDir", "D:");
    settings.endGroup(); 
    //  beginGroup    '/'           
    settings.setValue("MAIN/FILE/INFO/exeTitle", "Test");
    //            [General]
    settings.setValue("curDir", "D:");
    //            
    settings.setValue("MAIN/curDir", "D:");

    QList logins;
    Login login1 = { "inno", "123456" };
    Login login2 = { "gyj", "123456" };
    logins << login1 << login2;
    settings.beginWriteArray("logins");
    for (int i = 0; i < logins.size(); ++i) {
        settings.setArrayIndex(i);
        settings.setValue("userName", logins.at(i).userName);
        settings.setValue("password", logins.at(i).password);
    }
    settings.endArray();
    settings.sync();
}

setting.iniファイルの内容は
[MAIN%20FILE%20INFO]
MAIN\FILE\INFO\exeTitle=Test
curDir=D:

[MAIN]
FILE\INFO\exeTitle=Test
curDir=D:

[General]
curDir=D:

[logins]
1\userName=inno
1\password=123456
2\userName=gyj
2\password=123456
size=2

2.QSettings iniファイルを読む
#include 
#include 
struct Login {
    QString userName;
    QString password;
};
void main(int argc, char *argv[])
{
    QSettings settings("setting.ini", QSettings::IniFormat);
    settings.beginGroup("MAIN FILE INFO");
    qDebug() << settings.value("MAIN/FILE/INFO/exeTitle").toString();
    settings.endGroup();
    qDebug() << settings.value("MAIN/FILE/INFO/exeTitle").toString();
    qDebug() << settings.value("curDir").toString();


    int size = settings.beginReadArray("logins");
    for (int i = 0; i < size; ++i) {
        settings.setArrayIndex(i);
        qDebug() << settings.value("userName").toString();
        qDebug() << settings.value("password").toString();

    }
    settings.endArray();
}

出力:
"Test"
"Test"
"D:"
"inno"
"123456"
"gyj"
"123456"

3.QSettingsカスタムデータ構造データの読み書き
2つのキー値ペアを使用して、1つのLogin構造体データを保存しました.これにより、保存と付与が面倒になります.構造体を探すことでQdataStream&operator>>とQdataStream&operator<のペアを追加できます.
#include 
#include 
#include 

struct Login {
    QString userName;
    QString password;
};
QDataStream& operator<>(QDataStream& in, Login &obj)
{
    in >> obj.userName >> obj.password;
    return in;
}
//Q_DECLARE_METATYPE 
//             QMetaType     QVaiant   ,      。
//            、  、       
Q_DECLARE_METATYPE(Login)

void main(int argc, char *argv[])
{
    //  Login QSettings  
    qRegisterMetaTypeStreamOperators("Login");
    QSettings settings("setting.ini", QSettings::IniFormat);
    settings.clear();
    Login login = {"inno", "123456" };
    settings.setValue("login", QVariant::fromValue(login));
    settings.sync();
}

読み込みは通常の読み込みと同じです