1. 引言

在开发Qt服务应用时,配置文件(INI文件)扮演着重要的角色。INI文件,全称为Initialization File,即初始化文件,是Windows系统配置文件所采用的存储格式,也被广泛应用于其他操作系统中以存储程序的配置信息。INI文件由节(section)、键(key)和值(value)三部分组成,非常适合用于存储和管理应用程序的配置数据。

2. INI文件结构

INI文件的基本结构由节、键和值组成,每部分都扮演着不同的角色:

  • 节(Section):用方括号[]括起来,单独占一行,用于区分不同的配置区域。例如[Database][Network]等。
  • 键(Key):也称为属性(Property),用于标识配置项的名称,与值之间用等号=连接。例如IPAddress=192.168.1.1
  • 值(Value):与键相关联的数据,可以是数字、字符串等。

注释以分号;开始,该行中分号后面的内容都将被视为注释。

3. Qt中INI文件的操作

在Qt中,INI文件的操作主要通过QSettings类来实现。QSettings提供了丰富的API来读写INI文件,使得操作变得简单方便。

3.1 构造函数

  • QSettings(const QString &fileName, QSettings::Format format = QSettings::NativeFormat)
    • 参数说明
      • fileName:INI文件的路径和名称。可以是相对路径或绝对路径。
      • format:指定存储格式,对于INI文件,应使用QSettings::IniFormat
#include <QSettings>  // 头文件

// 直接使用QSetting类读写INI文件
QSettings config("config.ini", QSettings::IniFormat);

3.2 写入INI文件

在Qt中写入INI文件,首先需要创建一个QSettings对象,并指定INI文件的路径和格式(QSettings::IniFormat)。然后,使用setValue方法写入键值对。

  • void setValue(const QString &key, const QVariant &value)
    • 参数说明
      • key:要设置的配置项的名称,格式为“节名/键名”。如果之前使用了beginGroup,则这里的key只需指定键名。
      • value:与键关联的值,可以是QVariant支持的任何类型。
#include <QSettings>
#include <QDebug>

void WriteIniFiles() // 写入配置文件
{
    // 直接使用QSetting类读写INI文件
    QSettings wconfig("config.ini", QSettings::IniFormat);

    // 向INI文件写入数据信息setValue()方法
    // 第一节信息
    wconfig.setValue("/database/ip","192.168.12.168");  // 第一个参数,以此类推
    wconfig.setValue("/database/port","3380");
    wconfig.setValue("/database/user","root");
    wconfig.setValue("/database/password","123456");
    // 第二节信息
    wconfig.setValue("/notice/version","4.8");
    wconfig.setValue("/notice/datetime","2024-07-23 10:14:06");

    // 不需要手动关闭文件,QSettings对象在作用域结束时自动处理
}

3.3 读取INI文件

读取INI文件同样简单,使用QSettings对象的value方法即可。value方法会返回QVariant类型的数据,可以根据需要转换为相应的类型。

  • QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const
    • 参数说明
      • key:要读取的配置项的名称,格式为“节名/键名”。
      • defaultValue:如果指定的键不存在,则返回此默认值。默认为一个空的QVariant
  • QString value(const QString &key, const QString &defaultValue = QString()) const
    • 这是value方法的一个重载版本,专门用于读取字符串类型的值。它接受一个字符串类型的默认值。
void ReadIniFiles() // 读取配置文件
{
    QSettings rconfig("config.ini", QSettings::IniFormat);

    // 向INI文件读取数据信息value()方法
    QString strip = rconfig.value("/database/ip").toString();
    QString strport = rconfig.value("/database/port").toString();
    QString struser = rconfig.value("/database/user").toString();
    QString strpassword = rconfig.value("/database/password").toString();

    QString strversion = rconfig.value("/notice/version").toString();
    QString strdatetime = rconfig.value("/notice/datetime").toString();

    // 输出读取配置文件的参数信息
    qDebug() << "读取INI配置文件参数选项如下:";
    qDebug() << "config  IP地址:" << strip.toUtf8().data();  // toUtf8().data()去掉双引号操作
    qDebug() << "config  port端口号:" << strport.toUtf8().data();
    qDebug() << "config  user用户名:" << struser.toUtf8().data();
    qDebug() << "config  password密码:" << strpassword.toUtf8().data();
    qDebug() << "config  version版本号:" << strversion.toUtf8().data();
    qDebug() << "config  datetime时间:" << strdatetime.toUtf8().data();
}

3.4 分组操作

对于较大的配置文件,可以使用beginGroupendGroup方法来进行分组操作,以便更清晰地组织和管理配置数据。

  • void beginGroup(const QString &group) 和 void endGroup()
    • 参数说明
      • group:要进入的节的名称。在beginGroupendGroup之间的所有setValue调用都会将值设置到该节下。
void groupOperations() {  
    QSettings config("config.ini", QSettings::IniFormat);  
    config.beginGroup("Database");  
    config.setValue("IP", "192.168.12.168");  
    config.setValue("Port", "3380");  
    config.endGroup();  
  
    // 读取分组中的数据  
    config.beginGroup("Database");  
    QString ip = config.value("IP").toString();  
    int port = config.value("Port").toInt();  
    config.endGroup();  
  
    qDebug() << "Database IP:" << ip;  
    qDebug() << "Database Port:" << port;  
}

4. 代码及运行结果

4.1 代码示例

wrinifile.h
#ifndef WRINIFILE_H
#define WRINIFILE_H

void WriteIniFiles();   // 写配置文件

void ReadIniFiles();    // 读配置文件

#endif // WRINIFILE_H
wrinifile.cpp
#include "wrinifile.h"

#include <QSettings>
#include <QDebug>

void WriteIniFiles() // 写入配置文件
{
    // 直接使用QSetting类读写INI文件
    QSettings wconfig("config.ini", QSettings::IniFormat);

    // 向INI文件写入数据信息setValue()方法
    // 第一节信息
    wconfig.setValue("/database/ip","192.168.12.168");  // 第一个参数,以此类推
    wconfig.setValue("/database/port","3380");
    wconfig.setValue("/database/user","root");
    wconfig.setValue("/database/password","123456");
    // 第二节信息
    wconfig.setValue("/notice/version","4.8");
    wconfig.setValue("/notice/datetime","2024-07-23 10:14:06");

    // 不需要手动关闭文件,QSettings对象在作用域结束时自动处理
}

void ReadIniFiles() // 读取配置文件
{
    QSettings rconfig("config.ini", QSettings::IniFormat);

    // 向INI文件读取数据信息value()方法
    QString strip = rconfig.value("/database/ip").toString();
    QString strport = rconfig.value("/database/port").toString();
    QString struser = rconfig.value("/database/user").toString();
    QString strpassword = rconfig.value("/database/password").toString();

    QString strversion = rconfig.value("/notice/version").toString();
    QString strdatetime = rconfig.value("/notice/datetime").toString();

    // 输出读取配置文件的参数信息
    qDebug() << "读取INI配置文件参数选项如下:";
    qDebug() << "config  IP地址:" << strip.toUtf8().data();  // toUtf8().data()去掉双引号操作
    qDebug() << "config  port端口号:" << strport.toUtf8().data();
    qDebug() << "config  user用户名:" << struser.toUtf8().data();
    qDebug() << "config  password密码:" << strpassword.toUtf8().data();
    qDebug() << "config  version版本号:" << strversion.toUtf8().data();
    qDebug() << "config  datetime时间:" << strdatetime.toUtf8().data();
}
main.cpp
#include <QCoreApplication>
#include "wrinifile.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    WriteIniFiles();
    ReadIniFiles();
    return a.exec();
}

4.2 运行结果

写入config.ini文件

读取config.ini文件

5. 注意事项

  • 使用QSettings时,不需要手动打开和关闭文件,QSettings对象会在其作用域结束时自动处理。
  • INI文件的路径可以是绝对路径,也可以是相对路径。如果是相对路径,则相对于应用程序的当前工作目录。
  • 在读取不存在的键时,value方法会返回一个默认构造的QVariant对象,需要根据实际情况进行转换和检查。

6. 结论

INI文件是Qt服务应用中常用的配置文件格式,通过QSettings类可以方便地进行读写操作。掌握INI文件的操作对于开发具有灵活配置能力的Qt应用至关重要。希望本文能为你提供有益的参考和帮助。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐