Qt 读取和写入 INI 格式的配置文件

news2025/7/26 22:07:38

Qt 读取和写入 INI 格式的配置文件

  • 前言:INI 配置文件在 Qt 开发中的重要性
  • 基础夯实:INI 文件结构与 QSettings 核心概念
    • 1. INI 文件的基本结构
    • 2. QSettings 类概述
    • 3. 初始化 QSettings 对象
    • 4. 基本读写操作
    • 5. 高级操作技巧
      • 5.1 处理数组和列表
      • 5.2 检查键是否存在
      • 5.3 删除配置项
      • 5.4 同步操作
  • 实例效果展示:
  • 实现功能:
  • 核心代码:

前言:INI 配置文件在 Qt 开发中的重要性

在 Qt 应用程序开发中,配置文件是实现用户个性化设置与系统参数持久化的重要工具。INI (Initialization) 格式因其简洁的结构、跨平台兼容性和易于手动编辑的特性,成为存储应用程序配置的理想选择。通过 Qt 提供的QSettings类,开发者可以轻松实现 INI 文件的读写操作,无需关心底层实现细节,从而将更多精力投入到业务逻辑开发中。
本文将详细介绍如何使用 Qt 的QSettings类高效读写 INI 格式配置文件,涵盖基础操作、高级技巧及实际应用场景,帮助你在项目中更好地管理和维护配置信息。

基础夯实:INI 文件结构与 QSettings 核心概念

1. INI 文件的基本结构

INI 文件由三部分组成:
节 (Section):用方括号[]标识,用于分组相关配置项
键值对 (Key-Value):格式为Key=Value,存储具体配置信息
注释:以分号;或井号#开头的行,用于说明配置用途

[General]        ; 通用设置节
WindowSize=800x600
FullScreen=false

[Network]        ; 网络设置节
ServerAddress=127.0.0.1
Port=8080

[User]           ; 用户信息节
Name=John Doe
Email=john@example.com

2. QSettings 类概述

QSettings是 Qt 提供的用于读写配置文件的核心类,支持多种格式:
QSettings::IniFormat - INI 文本格式
QSettings::NativeFormat - 操作系统原生格式 (Windows 注册表 /macOS CFPreferences)
QSettings::JsonFormat - JSON 格式 (Qt 5.15+)
核心优势:
统一的 API 接口,屏蔽底层格式差异
自动处理数据类型转换
支持默认值机制
线程安全设计
支持嵌套分组结构

3. 初始化 QSettings 对象

创建操作 INI 文件的QSettings实例有两种方式:
方式一:全局应用程序范围 (推荐)

// 在main函数中设置应用程序信息
QCoreApplication::setOrganizationName("MyCompany");
QCoreApplication::setApplicationName("MyApp");

// 使用全局设置
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "MyCompany", "MyApp");
// 配置文件将自动保存到系统默认位置(如Windows: %APPDATA%\MyCompany\MyApp.ini)

方式二:指定文件路径

QSettings settings("config.ini", QSettings::IniFormat);
// 配置文件将保存在应用程序同级目录下

4. 基本读写操作

QSettings通过setValue()和value()方法实现配置项的读写:

// 写入配置
settings.setValue("General/WindowSize", "800x600");
settings.setValue("Network/ServerAddress", "127.0.0.1");
settings.setValue("User/LoggedIn", true);

// 读取配置(带默认值)
QString windowSize = settings.value("General/WindowSize", "640x480").toString();
QString server = settings.value("Network/ServerAddress", "localhost").toString();
bool loggedIn = settings.value("User/LoggedIn", false).toBool();

关键特性:
使用/分隔节名和键名,支持嵌套结构
自动类型转换:支持 QString、int、bool、QVariant 等类型
写入操作自动触发文件保存,无需显式调用 save ()

5. 高级操作技巧

5.1 处理数组和列表

// 写入数组
settings.beginWriteArray("RecentFiles");
for (int i = 0; i < files.size(); ++i) {
    settings.setArrayIndex(i);
    settings.setValue("filePath", files[i]);
}
settings.endArray();
// 读取数组
int size = settings.beginReadArray("RecentFiles");
for (int i = 0; i < size; ++i) {
    settings.setArrayIndex(i);
    QString filePath = settings.value("filePath").toString();
    // 处理文件路径
}
settings.endArray();

5.2 检查键是否存在

if (settings.contains("User/Email")) {
    // 存在则读取
    QString email = settings.value("User/Email").toString();
}

5.3 删除配置项

// 删除单个键
settings.remove("User/Email");

// 删除整个节
settings.remove("Network");

5.4 同步操作

通常无需手动调用,但在需要确保数据立即写入磁盘时使用:

settings.sync();

实例效果展示:

在这里插入图片描述
ini文件被创建
在这里插入图片描述
在这里插入图片描述
配置文件内容初始化文件内容一致。

实现功能:

实现在用户登录时,ini文件为空时的创建,如果ini文件存在,则根据用户的操作进行读取和写入。之前是使用数据库实现用户的登录和忘记密码操作的。但是有时候使用ini文件操作会更加简单,可以替换数据库的操作。

核心代码:

// 创建默认配置文件
void loginPage::createDefaultConfig()
{
    QSettings settings(filePathStr, QSettings::IniFormat);

    // 设置默认值
    settings.setValue("Login/lockPassword", false);
    settings.setValue("Login/autoLogin", false);
    settings.setValue("Login/password", "123456"); // 密码使用字符串格式存储
    settings.setValue("Login/hospitalName", "医院");

    qDebug() << "创建默认配置文件,初始密码: 123456";
}

// 读取配置文件
void loginPage::readSettings()
{
    QSettings settings(filePathStr, QSettings::IniFormat);

    // 读取配置
    lockPassword = settings.value("Login/lockPassword", false).toBool();
    autoLoginFlag = settings.value("Login/autoLogin", false).toBool();
    passwordStr = settings.value("Login/password", "").toString();
    hospitalName = settings.value("Login/hospitalName", "").toString();


    // 更新UI状态
    ui->checkBoxLockPassword->setChecked(lockPassword);
    ui->checkBoxAutoLogin->setChecked(autoLoginFlag);

    // 如果记住密码,填充密码
    if (lockPassword) {
        ui->editPassword->setText(passwordStr);
    }
}

// 写入配置文件
void loginPage::writeSettings()
{
    QSettings settings(filePathStr, QSettings::IniFormat);

    // 写入配置
    settings.setValue("Login/lockPassword", lockPassword);
    settings.setValue("Login/autoLogin", autoLoginFlag);
    settings.setValue("Login/password", passwordStr);
    settings.setValue("Login/hospitalName", hospitalName);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring:从青铜到王者,你的Java修炼手册

一、Spring家族宇宙&#xff1a;原来你是这样的框架&#xff08;青铜段位&#xff09; 1.1 Spring的"前世今生"&#xff1a;从泡面到满汉全席 ​​2002年的泡面哲学​​&#xff1a;Rod Johnson在厨房煮泡面时突然顿悟&#xff1a;"Java开发为什么不能像泡面一…

Qt creator 设计页面控件认识与了解

记录一下 Qt 中的认识与了解&#xff1a; 在 Qt 中&#xff0c;这些功能属于 Qt Designer 的组件过滤系统&#xff0c;旨在帮助开发者在对象浏览器中快速定位和使用不同类型的控件和组件。以下是每个功能的详细讲解&#xff1a; ‌Layouts&#xff08;布局&#xff09;‌&…

NVIDIA Mellanox BlueField-2 DPU(Data Processing Unit)智能网卡的调试和使用

专有名词 OOB&#xff1a; BMC&#xff1a; BFB&#xff1a; EMMC&#xff1a; 关键词解释eMMCEmbedded Multi-Media Card——把 NAND 闪存颗粒与控制器封装在一起的板载存储件&#xff0c;类似手机里的“内置储存” .deb&#xff1a;文件是​​Debian软件包格式​​的专…

Tomcat- AJP协议文件读取/命令执行漏洞(幽灵猫复现)详细步骤

一、漏洞描述 Apache Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器.默认情况下,Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互.但Apache Tomcat在AJP协议的实现上存在漏洞,导致攻击者可以通过发送恶意的AJP请求,可以读取或者包含Web应…

B1、进度汇报(— 25/05/31)

本文档汇总了各成员在 2025 年 5 月 11 日 ~ 5 月 31 日完成的工作。我们遇到了进度问题&#xff08;收工后需反思&#xff09;&#xff1a; 本学期第十四周&#xff08;05/19 ~ 05/25&#xff09;有相当多课程需要提交实验结果或上台展示。本学期第十六周&#xff08;06/02 ~…

Flutter实现不规则瀑布流布局拖拽重排序

因为业务&#xff0c;所以需要用flutter去实现一种不规则图形的瀑布流&#xff0c;但是同时需要支持拖拽并重新排序。效果类似如下。 查询过现有的插件&#xff0c;要么是仅支持同样大小的组件进行排序&#xff0c;要么就是动画效果不是很满意&#xff0c;有点死板&#xff0c;…

【第4章 图像与视频】4.1 图像的绘制

文章目录 前言在 Canvas 之中绘制图像drawImage() 方法的用法 前言 drawImage() 方法可以将一幅图像的整体或某个部分绘制到 canvas 内的任何位置上&#xff0c;并且允许开发者在绘制过程中对图像进行缩放。也可以将图像绘制在离屏 canvas 中&#xff0c;这样的话就可以对图像…

G25-05-31Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1Pake: 利用 Rust 轻松构建轻量级多端桌面应用 创建周期:491 天开发语言:Rust协议类型:MIT LicenseStar数量:2095…

window安装nginx

步骤1&#xff1a;下载Nginx for Windows​ 访问Nginx官网下载页面&#xff1a;https://nginx.org/en/download.html 在​​Stable version​​&#xff08;稳定版&#xff09;下找到Windows版本&#xff0c;点击下载.zip文件&#xff08;如 nginx-1.28.0.zip&#xff09; 步…

ArcGIS Pro裁剪影像

方法1&#xff1a; 工具箱中&#xff0c;数据管理工具-栅格-栅格处理-裁剪栅格 注意&#xff1a;勾选上使用输入要素裁剪几何 方法2&#xff1a; 按掩膜提取工具裁剪栅格&#xff1a;在工具箱中&#xff0c;Spatial Analyst工具-提取分析-按掩膜提取

[智能算法]蚁群算法原理与TSP问题示例

目录 ​编辑 一、生物行为启发的智能优化算法 1.1 自然界的群体智能现象 1.2 人工蚁群算法核心思想 二、算法在组合优化中的应用演进 2.1 经典TSP问题建模 2.2 算法流程优化 三、TSP问题实战:Python实现与可视化 3.1 算法核心类设计 3.2 参数敏感性实验 3.3 可视化…

【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)

引言 Fyne 是一个使用 Go 语言编写的、易于使用的跨平台 GUI 工具包和应用程序 API。它旨在通过单一代码库构建在桌面和移动设备上运行的应用程序。本文档面向有一定 Go 语言开发经验的开发者&#xff0c;将详细介绍 Fyne 最新版的核心功能&#xff0c;包括基础组件、布局系统…

openssl 怎么生成吊销列表

mkdir test cd test # 根据 /usr/lib/ssl/openssl.cnf 配置文件中目录结构可知有个demoCA目录&#xff0c;目录下有各种文件。 mkdir ./demoCA ./demoCA/newcerts ./demoCA/private sudo chmod 777 -R ./demoCA/ echo 01 > ./demoCA/serial touch ./demoCA/index.txt # /usr…

springboot-响应接收与ioc容器控制反转、Di依赖注入

1.想将服务器中的数据返回给客户端&#xff0c;需要在controller类上加注解&#xff1a;ResponseBody; 这个注解其实在前面已经使用过&#xff0c;RestController其实就包含两个注解&#xff1a; Controller ResponseBody 返回值如果是实体对象/集合&#xff0c;将会转换为j…

Spring代理工厂类ProxyFactory作用以及实现原理

代理工厂类ProxyFactory AdvisedSupport&#xff08;代理配置信息类&#xff09;ProxyFactory&#xff08;代理工厂类&#xff09;小结测试 源码见&#xff1a;mini-spring 在 AOP&#xff08;面向切面编程&#xff09;中&#xff0c;Spring 支持两种常见的代理机制&#xff1a…

集成电路制造设备防震基座选型指南:为稳定护航-江苏泊苏系统集成有限公司

集成电路制造设备防震基座选型指南&#xff1a;为稳定护航 在集成电路制造这一精密复杂的领域&#xff0c;每一个环节都如同精密仪器中的微小齿轮&#xff0c;一丝偏差都可能导致严重后果。制造设备的稳定运行更是重中之重&#xff0c;而防震基座作为守护设备稳定的第一道防线…

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

探索DeepSeek提示词:关键策略与实用场景

在人工智能飞速发展的时代&#xff0c;DeepSeek作为一款备受关注的AI工具&#xff0c;其强大的功能为用户提供了高效便捷的服务。然而&#xff0c;要充分发挥DeepSeek的潜力&#xff0c;掌握提示词的使用策略至关重要。本文将深入探讨DeepSeek提示词的关键策略&#xff0c;并结…

海底三维可视化平台

1. 摘要 本文作者为视觉分析构建了一个真实海底的“虚拟世界”。在3D环境中导入底部轮廓。在该模型中&#xff0c;通过地震反射获得的海床地层剖面被数字化为离散点&#xff0c;并用克里金算法进行插值&#xff0c;以在每个地层中产生均匀的网格。然后在每一层构建 Delaunay三…

Elasticsearch 读写流程深度解析

在数据驱动的数字化浪潮中&#xff0c;Elasticsearch 凭借其毫秒级搜索响应与水平扩展能力&#xff0c;已成为现代数据架构的核心引擎。本文将深入剖析其读写流程的设计思想、实现细节与工程权衡&#xff0c;揭示这一分布式系统的精妙架构。 一、 架构基石&#xff1a;分布式设…