当前位置: 首页 > news >正文

Qt读写ini文件的方式对比和Demo示例

在 Qt 中读写 INI 文件 主要有以下几种方式,常用且推荐的是 QSettings,因为它直接支持 INI 格式并且跨平台。以下详细介绍几种方式,并提供示例代码。

✅ 方式 1:QSettings(推荐)

Qt 提供的 QSettings 类可以直接读写 INI 文件,最简单且跨平台。

特点

    •    ✅ 支持 INI 和注册表(Windows)。

    •    ✅ 自动管理分组、键值。

    •    ✅ 读写类型安全(int、double、QString、bool 等)。

    •    ✅ 自动创建文件。

示例:读写 INI 文件

假设文件路径:config.ini

[User]

name=Keven

age=30

写入示例

#include <QCoreApplication>

#include <QSettings>

#include <QDebug>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    // 创建QSettings对象,指定文件名和格式

    QSettings settings("config.ini", QSettings::IniFormat);

    // 开始写入数据

    settings.beginGroup("User");

    settings.setValue("name", "Keven");

    settings.setValue("age", 30);

    settings.endGroup();

    qDebug() << "INI 文件写入完成";

    return 0;

}

读取示例

#include <QCoreApplication>

#include <QSettings>

#include <QDebug>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    QSettings settings("config.ini", QSettings::IniFormat);

    settings.beginGroup("User");

    QString name = settings.value("name", "DefaultName").toString();

    int age = settings.value("age", 0).toInt();

    settings.endGroup();

    qDebug() << "用户名:" << name << ", 年龄:" << age;

    return 0;

}

✅ 方式 2:QSettings + 自定义路径(跨平台安全)

如果要保存到 应用程序目录 或 用户配置目录,可以用 QStandardPaths 获取路径。

#include <QSettings>

#include <QStandardPaths>

#include <QDir>

QString configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);

QDir().mkpath(configPath);  // 确保目录存在

QSettings settings(configPath + "/config.ini", QSettings::IniFormat);

settings.setValue("System/Language", "Chinese");

⚡ 方式 3:QFile + QTextStream(手动解析)

适用于需要完全自定义格式或更高控制权的场景。

但 不推荐 直接操作 INI,因为需要自己解析 [Section] 和 key=value。

示例:

#include <QFile>

#include <QTextStream>

#include <QDebug>

int main()

{

    QFile file("config.ini");

    // 写入

    if(file.open(QIODevice::WriteOnly | QIODevice::Text))

    {

        QTextStream out(&file);

        out << "[User]\n";

        out << "name=Keven\n";

        out << "age=30\n";

        file.close();

    }

    // 读取

    if(file.open(QIODevice::ReadOnly | QIODevice::Text))

    {

        QTextStream in(&file);

        while (!in.atEnd()) {

            QString line = in.readLine();

            qDebug() << line;

        }

        file.close();

    }

    return 0;

}

⚡ 方式 4:第三方库(如 inih、Boost.PropertyTree`)

如果需要:

    •    跨平台、跨语言兼容。

    •    更复杂的结构(如数组、注释控制)。

可使用第三方库,但在 Qt 项目中一般 QSettings 已足够。

🔑 总结对比

🌟 最佳实践

    •    小型应用或配置文件:直接使用 QSettings。

    •    需要兼容 Windows 注册表:QSettings(NativeFormat)。

    •    INI 文件有特殊规则:QFile + QTextStream 自定义解析。

完整示例:

下面给你一个 完整的 Qt Widgets Demo(可在 QtCreator 直接创建 Widgets Application 运行),演示如何通过按钮操作来读写 config.ini。

本示例包含:

✅ 写入 INI 文件(用户名、年龄)

✅ 读取 INI 文件并显示到界面

✅ 界面操作 + QSettings 结合

工程下载地址https://download.csdn.net/download/2501_91893428/91940183

📂 文件结构

QtIniDemo/

├─ main.cpp

├─ mainwindow.h

├─ mainwindow.cpp

└─ mainwindow.ui

1️⃣ mainwindow.ui

用 Qt Designer 拖拽以下控件

最终界面示例:

用户名: [ QLineEdit ]

年龄  : [ QLineEdit ]

[ 保存到INI ] [ 从INI读取 ]

2️⃣ main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.show();

    return a.exec();

}

3️⃣ mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QSettings>

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }

QT_END_NAMESPACE

class MainWindow : public QMainWindow

{

    Q_OBJECT

public:

    MainWindow(QWidget *parent = nullptr);

    ~MainWindow();

private slots:

    void saveIni(); // 保存配置

    void loadIni(); // 读取配置

private:

    Ui::MainWindow *ui;

    QString iniPath; // ini文件路径

};

#endif // MAINWINDOW_H

4️⃣ mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDebug>

#include <QDir>

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    // 指定 INI 文件路径(保存在程序运行目录)

    iniPath = QDir::currentPath() + "/config.ini";

    qDebug() << "INI文件路径:" << iniPath;

    // 连接按钮信号槽

    connect(ui->btnSave, &QPushButton::clicked, this, &MainWindow::saveIni);

    connect(ui->btnLoad, &QPushButton::clicked, this, &MainWindow::loadIni);

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::saveIni()

{

    QSettings settings(iniPath, QSettings::IniFormat);

    settings.beginGroup("User");

    settings.setValue("name", ui->lineEditName->text());

    settings.setValue("age", ui->lineEditAge->text().toInt());

    settings.endGroup();

    settings.sync();  // 确保写入磁盘

    qDebug() << "已保存到INI文件";

}

void MainWindow::loadIni()

{

    QSettings settings(iniPath, QSettings::IniFormat);

    settings.beginGroup("User");

    QString name = settings.value("name", "默认用户").toString();

    int age = settings.value("age", 0).toInt();

    settings.endGroup();

    ui->lineEditName->setText(name);

    ui->lineEditAge->setText(QString::number(age));

    qDebug() << "从INI文件读取完成:" << name << age;

}

5️⃣ 生成的 config.ini 示例

点击“保存到INI”后,会在程序运行目录生成:

[User]

name=Keven

age=30

🚀 编译运行

    1.    打开 Qt Creator → 新建 Qt Widgets Application → 替换代码。

    2.    点击运行,输入用户名、年龄,点击 保存到INI。

    3.    再点击 从INI读取,即可在界面显示存储的值。

🔑 亮点

    •    使用 QSettings 自动管理 INI 文件格式。

    •    settings.sync() 确保数据立即写入磁盘。

    •    文件路径使用 QDir::currentPath(),可根据需要替换为 QStandardPaths(跨平台安全)。


文章转载自:

http://mtUhzVAX.qtrLh.cn
http://zbPGHehd.qtrLh.cn
http://Oe3dJt3F.qtrLh.cn
http://0eaYLaBH.qtrLh.cn
http://V2DRBPgG.qtrLh.cn
http://g78CgtZy.qtrLh.cn
http://84j85B3k.qtrLh.cn
http://MpdgNxRm.qtrLh.cn
http://h9T2DpBe.qtrLh.cn
http://bsGcaFtL.qtrLh.cn
http://WMddabfh.qtrLh.cn
http://3FxQFeOc.qtrLh.cn
http://vT0p41S9.qtrLh.cn
http://MawH1Wp1.qtrLh.cn
http://qDEZOEKB.qtrLh.cn
http://qs4siKhZ.qtrLh.cn
http://LfukzCTH.qtrLh.cn
http://N1ldfpvg.qtrLh.cn
http://AQVLCOgo.qtrLh.cn
http://xgpwYURf.qtrLh.cn
http://WiDBw9I8.qtrLh.cn
http://jPb0mlXp.qtrLh.cn
http://BdaRaEty.qtrLh.cn
http://hDkBl4Wv.qtrLh.cn
http://ktrthYke.qtrLh.cn
http://gqQGxVtH.qtrLh.cn
http://1e0g1jNJ.qtrLh.cn
http://7mZ2CtKO.qtrLh.cn
http://XXFpF4i7.qtrLh.cn
http://C1GZWXCH.qtrLh.cn
http://www.dtcms.com/a/383332.html

相关文章:

  • xtuoj 连分式
  • 使用B210在Linux下实时处理ETC专用短程通信数据(5)-业余软件无线电户外经验
  • 机器人逆运动学进阶:李代数、矩阵指数与旋转流形计算
  • XLua教程之C#调用Lua
  • IDEA版本控制管理之使用Gitee
  • 贪心算法应用:航班起降问题详解
  • 【Linux】CentOS7安装教程
  • Java面试问题记录(四)
  • 制造业 “AI+” 转型案例:智能质检、预测性维护如何降本提效 30%?
  • 视频全模态referring分割:Ref-AVS: Refer and Segment Objects in Audio-Visual Scenes
  • 高数基础知识(下)②
  • 【人工智能通识专栏】第十五讲:视频生成
  • [硬件电路-206]:绝缘体、导体、半导体
  • 算法日记---二分查找
  • Pandas模块
  • 在Unity2021中使用Profiler的Deep Profile功能时内存超高怎么办?
  • GooseDB,一款实现服务器客户端模式的DuckDB
  • openEuler部署Samba服务器:实现跨平台文件共享
  • 认知语义学的象似性原理对人工智能自然语言处理深层语义分析的影响与启示
  • 【Linux】线程池模拟
  • TensorRT 10.13.3: Limitations
  • RK3568编写自启动脚本
  • AI 伦理争议背后:算法偏见如何产生?又该如何规避?
  • C++ 中使用 iterator 中注意事项和优化技巧(2)
  • 【MySQL|第八篇】事务与索引
  • OD C卷 - 小明找位置
  • JavaScript与jQuery:从入门到面试的完整指南
  • 最长上升子序列(LIS)全解析:从基础到进阶(基础讲解篇)
  • 海盗王64位dx9客户端修改篇之七
  • 【c++进阶系列】:map和set的模拟实现(附模拟实现的源码)