int ファイルは多くの人に馴染みがあると思いますが、大規模なソフトウェアの一部の設定ファイルでは、ini 形式のファイルが使用されることが一般的です。Qtではiniファイルの作成や要素の追加・削除などの機能も提供しています。
ini 内のデータには通常、グループと、そのグループに含まれるキーと値の値が含まれます。
Qt は、ini 形式のファイル操作に関連する関数を実装するクラス QSettings を使用します。
Qt の公式ドキュメントには、QSettings クラスを使用するには 2 つの方法があると記載されています。1 つは、QSettings を通じてそのプロパティをシステムのレジストリに設定する方法で、もう 1 つはローカルの ini ファイルとして保存する方法です。
QSettings クラスを使用して構成をレジストリに保存します
使用手順は次のとおりです。
1. QCoreApplication::setOrganizationName("会社名"); および QCoreApplication::setApplicationName("アプリケーション名"); を使用します。
2. QSettings を直接使用して、パラメーターなしでオブジェクトを構築します。
3. QSettings の setValue() 関数を使用して属性値を設定します。
4. QSettings の値を使用して属性値を取得します。
たとえば、製品の名前が Star Runner で、会社の名前が MySoft であるとします。(これはqtでの例です)
QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setApplicationName("Star Runner");
...
QSettings settings;
上記は最初のステップであり、このステップの実行後、エディタは、対応するレジストリ構造 MySoft->Star Runner がレジストリ内に作成されると推定します。
その後、QSettings オブジェクトを使用して、プロジェクト内の任意の場所でソフトウェア プロパティ値を作成および取得できます。
settings.setValue("editor/wrapMargin", 68);//设置属性值
int margin = settings.value("editor/wrapMargin").toInt();//获取属性值
QSettings にグループがある場合は、次の方法を使用できます。たとえば、センサー グループがあり、sensorType が属性、カメラが属性値です。
属性値を次のように設定します。
//m_settings是QSettings的对象
m_settings->beginGroup("sensor"); //打开组,如果没有就创建一个
m_settings->setValue("sensorType","camera");//设置属性和值
m_settings->endGroup();//结束值设置
属性値を取得します。
m_settings->beginGroup("sensor");//打开组
value = m_settings->value("sensorType").toString();//获取属性值
m_settings->endGroup();
これでレジストリプロパティの設定は完了ですが、ここで注意したいのは各システムのレジストリの違いです。
また、上記の方法で設定したプロパティはレジストリから直接アクセスできるため、主にグローバルプロパティの設定に適しており、比較的便利です。
ini ファイルへの直接アクセス
ini ローカル ファイルを直接使用することは、QSettings オブジェクトを作成する場合が異なることを除いて、登録標準操作プロセスへの書き込みとほぼ同じです。
1. QSettings クラスを使用してオブジェクトを作成します。オブジェクト作成プロセス中に 2 つのパラメーター (ファイル ストレージ パスとファイル形式) を導入する必要があります。
2. QSettings の setValue() 関数を使用して属性値を設定します。
3. QSettings の値を使用して属性値を取得します。
この利用方法は設定ファイルの変更が容易ですが、ソフトウェア使用中にグローバルに利用することはできませんが、C++のシングルトンモードを利用することでグローバルにユニークな利用方法を実現できます。
例: 構成ファイル myapp.ini を使用して構成ファイルを作成し、パス /home/petra/misc/myapp.ini を使用して構成ファイルを作成します。
QSettings settings("/Users/petra/misc/myapp.plist",
QSettings::NativeFormat);//创建QSettings对象
その後、QSettings オブジェクトを使用して、プロジェクト内の任意の場所でソフトウェア プロパティ値を作成および取得できます。
settings.setValue("editor/wrapMargin", 68);//设置属性值
int margin = settings.value("editor/wrapMargin").toInt();//获取属性值
QSettings にグループがある場合は、次の方法を使用できます。たとえば、センサー グループがあり、sensorType が属性、カメラが属性値です。
属性値を次のように設定します。
//m_settings是QSettings的对象
m_settings->beginGroup("sensor"); //打开组,如果没有就创建一个
m_settings->setValue("sensorType","camera");//设置属性和值
m_settings->endGroup();//结束值设置
属性値を取得します。
m_settings->beginGroup("sensor");//打开组
value = m_settings->value("sensorType").toString();//获取属性值
m_settings->endGroup();
この時点で、構成ファイルがセットアップされます。
以下は、エディターによってカプセル化されたシングルトン モード クラスです。
#ifndef CONFIGUREFILE_H
#define CONFIGUREFILE_H
#include <QString>
#include <QSettings>
class configureFile
{
public:
/**
* @brief writeConfig 向配置文件中添加数据
* @param group 所要添加的分类
* @param key 所要添加的键
* @param value 所要添加的值
*/
void writeConfig(QString group,QString key,QString value);
/**
* @brief readConfig 获取配置文件中对应键值的数据
* @param group 分类
* @param key 键
* @return 值
*/
QString readConfig(QString group,QString key);
/**
* @brief getInterface 获取配置文件对象
* @return 返回配置文件对象
*/
static configureFile* getInterface();
private:
configureFile();
~configureFile();
QSettings * m_settings = nullptr;
static configureFile * m_configFile;
};
#endif // CONFIGUREFILE_H
#include "configurefile.h"
configureFile* configureFile::m_configFile = nullptr;
configureFile::configureFile()
{
if(m_settings == nullptr){
m_settings = new QSettings("./hwots.ini",QSettings::IniFormat);
}
}
configureFile::~configureFile()
{
if(m_settings != nullptr){
delete m_settings;
}
}
void configureFile::writeConfig(QString group, QString key, QString value)
{
m_settings->beginGroup(group);
m_settings->setValue(key,value);
m_settings->endGroup();
}
QString configureFile::readConfig(QString group, QString key)
{
QString value;
m_settings->beginGroup(group);
value = m_settings->value(key).toString();
m_settings->endGroup();
return value;
}
configureFile* configureFile::getInterface()
{
if(m_configFile == nullptr){
m_configFile = new configureFile();
}
return m_configFile;
}