qt配置文件::INI介绍

一、INI 文件基础介绍

https://github.com/0voice

INI 文件是一种轻量级配置文件格式,以人类可读的文本形式存储应用程序的配置信息,广泛用于 Windows、跨平台应用中。其核心结构由三部分组成:

  • 节(Section) :用[ ]包裹,用于分组相关配置项(如代码中的[database][notice]);
  • 键值对(Key-Value) :格式为key=value,存储具体配置数据(如ip=192.168.12.189);
  • 注释 :以;开头,用于说明配置项含义(代码示例中未体现,实际使用可添加)。

INI 文件的优势在于结构简单、读写便捷、跨平台兼容,适合存储数据库连接信息、应用版本、用户偏好等非复杂配置。

二、Qt QSettings 类核心介绍

1. 什么是 QSettings?

QSettings 是 Qt 框架提供的跨平台配置文件读写工具类,无需手动解析文件格式,即可轻松操作 INI、注册表(Windows)、plist(macOS)等配置存储方式。其核心设计目标是:

  • 屏蔽不同平台的配置存储差异,实现 "一次编码,多平台兼容";
  • 简化配置项的增删改查操作,无需关注文件 IO 细节;
  • 支持自动类型转换(如字符串、数字、布尔值之间的自动转换)。

2. 核心特性

特性 说明
跨平台支持 自动适配 Windows(INI / 注册表)、macOS(plist)、Linux(INI)
格式支持 原生支持 INI 格式(QSettings::IniFormat),也支持默认格式
键值操作 通过setValue()写入、value()读取配置,支持层级键(如"database/ip"
自动管理 无需手动处理文件打开 / 关闭,析构时自动刷新数据到文件
类型转换 读取时可通过toString()toInt()等方法直接转换为目标类型

3. 关键接口说明

(1)构造函数:创建 QSettings 实例
cpp 复制代码
// 核心构造函数(INI文件场景)
QSettings::QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
  • fileName:配置文件路径(如代码中的"MySQL.ini",相对路径会生成在应用运行目录);
  • format:文件格式,必须指定QSettings::IniFormat才能生成标准 INI 文件;
  • parent:父对象,用于 Qt 的对象树管理(可选)。
(2)写入配置:setValue()
cpp 复制代码
void QSettings::setValue(const QString &key, const QVariant &value)
  • key:配置键,支持层级键 (用/分隔节和键名,如"database/ip"等价于[database]节下的ip键);
  • value:配置值,支持 Qt 的QVariant类型(可直接传入字符串、数字、布尔值等,自动适配存储)。
(3)读取配置:value()
cpp 复制代码
QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const
  • key:目标配置键(需与写入时的层级一致,如"database/port");
  • defaultValue:可选参数,当键不存在时返回的默认值;
  • 返回值:QVariant类型,需通过toString()toInt()等方法转换为具体类型。
(4)其他常用接口
接口 用途
contains(const QString &key) 判断某个配置键是否存在
remove(const QString &key) 删除指定配置键
clear() 清空所有配置项
childGroups() 获取所有节(Section)名称
childKeys() 获取某个节下的所有键名

三、代码实战解析(结合示例代码)

1. 写入 INI 文件:WriteIniFiles()

cpp 复制代码
void WriteIniFile::WriteIniFiles()
{
    // 1. 创建QSettings实例,指定INI格式
    QSettings *ConfigWriteIniFiles = new QSettings("MySQL.ini", QSettings::IniFormat);
    
    // 2. 写入层级配置(节/键 = 值)
    // [database] 节下的配置
    ConfigWriteIniFiles->setValue("database/ip", "192.168.12.189");
    ConfigWriteIniFiles->setValue("database/port", "3308");
    ConfigWriteIniFiles->setValue("database/user", "root");
    ConfigWriteIniFiles->setValue("database/password", "123456");
    
    // [notice] 节下的配置
    ConfigWriteIniFiles->setValue("notice/version", "5.6");
    ConfigWriteIniFiles->setValue("notice/datetime", "2022-10-25 16:27:23");
    
    // 3. 手动删除实例(或通过父对象自动管理),析构时写入文件
    delete ConfigWriteIniFiles;
}
生成的 INI 文件内容:
cpp 复制代码
[database]
ip=192.168.12.189
port=3308
user=root
password=123456

[notice]
version=5.6
datetime=2022-10-25 16:27:23

2. 读取 INI 文件:ReadIniFiles()(注意修正代码 bug)

示例代码中存在一个小错误:读取ip时的键名误写为"/databse/ip"(少了一个a),修正后解析如下:

cpp 复制代码
void WriteIniFile::ReadIniFiles()
{
    // 1. 创建读取实例(与写入时的文件名、格式一致)
    QSettings *ConfigReadIniFiles = new QSettings("MySQL.ini", QSettings::IniFormat);
    
    // 2. 读取配置并转换类型(键名需与写入完全一致)
    QString strip = ConfigReadIniFiles->value("database/ip").toString(); // 修正:databse → database
    QString strport = ConfigReadIniFiles->value("database/port").toString();
    QString struser = ConfigReadIniFiles->value("database/user").toString();
    QString strpassword = ConfigReadIniFiles->value("database/password").toString();
    QString strversion = ConfigReadIniFiles->value("notice/version").toString();
    QString strdatetime = ConfigReadIniFiles->value("notice/datetime").toString();
    
    // 3. 输出结果(toUtf8().data() 解决中文乱码问题)
    qDebug() << "读取INI配置文件参数选项如下:";
    qDebug() << "MySQL数据库IP地址:" << strip.toUtf8().data();
    qDebug() << "数据库端口:" << strport.toUtf8().data();
    qDebug() << "数据库用户:" << struser.toUtf8().data();
    qDebug() << "数据库密码:" << strpassword.toUtf8().data();
    qDebug() << "数据库版本:" << strversion.toUtf8().data();
    qDebug() << "数据库日期:" << strdatetime.toUtf8().data();
    
    // 4. 释放资源
    delete ConfigReadIniFiles;
}

3. 扩展:判断配置键是否存在(ReadIniFilesIsKey()实现)

cpp 复制代码
void WriteIniFile::ReadIniFilesIsKey()
{
    QSettings settings("MySQL.ini", QSettings::IniFormat);
    
    // 判断某个键是否存在
    if (settings.contains("database/ip")) {
        qDebug() << "database/ip 配置存在,值为:" << settings.value("database/ip").toString();
    } else {
        qDebug() << "database/ip 配置不存在,使用默认值:127.0.0.1";
        QString defaultIp = settings.value("database/ip", "127.0.0.1").toString(); // 不存在时返回默认值
    }
    
    // 获取所有节名称
    QStringList sections = settings.childGroups();
    qDebug() << "所有配置节:" << sections; // 输出:("database", "notice")
    
    // 获取某个节下的所有键
    settings.beginGroup("database"); // 进入[database]节
    QStringList dbKeys = settings.childKeys();
    qDebug() << "database节下的所有键:" << dbKeys; // 输出:("ip", "port", "user", "password")
    settings.endGroup(); // 退出节
}

四、使用 QSettings 的注意事项

  1. 键名大小写敏感 :Qt 5 中 QSettings 的键名默认区分大小写(如"database/IP""database/ip"是两个不同键),需保持读写一致;
  2. 文件路径问题 :相对路径(如"MySQL.ini")会生成在应用运行目录,建议使用绝对路径(如"D:/config/MySQL.ini")避免路径混乱;
  3. 中文乱码处理 :读取中文时,通过toUtf8().data()转换为 C 风格字符串,或直接使用qDebug() << str(Qt 5 + 默认支持 UTF-8);
  4. 资源管理 :手动创建的 QSettings 指针需手动delete,或使用智能指针(QScopedPointer)自动管理,避免内存泄漏;
  5. 默认值设置 :读取时建议指定默认值(如value("database/port", "3306")),防止键不存在导致空值异常。

五、总结

QSettings 是 Qt 操作 INI 文件的 "利器",无需关注底层文件解析,通过简单的setValue()value()即可完成配置读写。结合 INI 文件的轻量特性,二者常被用于:

  • 存储数据库连接信息、服务器地址、端口号;
  • 保存应用的用户偏好(如窗口大小、主题设置);
  • 记录应用版本、更新时间等元数据。

掌握 QSettings 的使用,能大幅简化跨平台应用的配置管理逻辑,提升开发效率。

相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能13 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G13 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt