QT学习笔记---ini文件读取与写入

本文介绍了在QT中如何使用QSettings读取和写入ini配置文件,但QSettings会删除原有内容。为解决这个问题,作者转向使用Windows API函数GetPrivateProfileString和WritePrivateProfileString进行读写,提供了相关的代码示例。这种方式能在不破坏ini文件原有内容的情况下进行读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ini文件在QT中的应用

在软件开发中,通常只需编译一次,然后将执行文件发出去使用,但是针对不同的应用场合,我们又需要修改某些配置项,因此ini文件和注册表在这些情况中就可以发挥作用了,本文选取的是通过读取ini文件获取相应的配置,并且在软件关闭时,将某些配置写入至ini文件中。

QT 中提供的读取ini的方法

QT 已经提供了一个ini文件的读取方法,如下图:

QSettings* cfg = new QSettings("Config.ini", QSettings::IniFormat);
	cfg->setValue("Student0/Name", "xiao ming");
	cfg->setValue("Student0/Sex", "man");
	cfg->setValue("Student0/Age", "23");

读取ini中的信息。

QSettings* cfg = new QSettings("Config.ini", QSettings::IniFormat);
QString name = cfg->value("Student0/Name");
QString sex = cfg->value("Student0/Sex");
int age = cfg->value("Student0/Age").toInt();

详细使用方法可以查看QT 的帮助文档,讲的很详细了。
但是这种方法写入ini文件后,每次都会删除ini中的其他内容,例如原本ini文件如下:

#这是一个ini测试文件
#此行无效
#----
[Student0]
Name=xiao ming
Sex=man
Age=23

通过QT的QSettings进行写入后,ini文件会被修改,如下所示:

[Student0]
Name=xiao ming
Sex=man
Age=23

原本我们的注释被删掉了,这对于我们来说“很恼火”,通过查询资料,发现这貌似就是QT QSettings的“特色”,因此我只能寻找其他方法来读写ini文件。那么问题来了,使用其他方法来读取ini文件的话,无非就两种思路:1、自己实现;2、使用windows的API函数。
为了可以快速实现,我先选择第2中方法,即使用windows的API函数来实现ini文件的读写,后续再自己实现ini文件的读写。

Windows API 读写ini

我们都知道,WINDOWS中有一系列的API可以使用,其中就包括了ini文件的读写,读取ini可以使用GetPrivateProfileString ,写入可以使用WritePrivateProfileString。
但是我们在QT中使用这些API时,需要注意类型转换,以下为测试代码。
其中需要包含#include “windows.h”,#include "tchar.h"头文件,m_cofigFilePath 为ini文件路径。

#if __arm__

#else
    #include "windows.h"
    #include "tchar.h"
#endif
void Widget::initConfigFilePath(const QString &FilePath)
{
    m_cofigFilePath = FilePath;
}
//读取ini里的信息
QString Widget::readConfigNode(QString c_strName,QString node)
{
    wchar_t buf[MAX_PATH] = {0};
    ::GetPrivateProfileString(c_strName.toStdWString().c_str(), node.toStdWString().c_str(), NULL, buf, sizeof(buf), m_cofigFilePath.toStdWString().c_str());
    return QString::fromWCharArray(buf, lstrlen(buf));
}

int Widget::readConfigNodeInt(QString c_strName,QString node)
{
    int value = 0;
    ::GetPrivateProfileInt(c_strName.toStdWString().c_str(), node.toStdWString().c_str(), value, m_cofigFilePath.toStdWString().c_str());
    return value;
}

//根据node往ini里写数据,nodeValue是你要写的值
void Widget::writeConfigValue(QString c_strName,QString node, const QString &nodeValue)
{
    ::WritePrivateProfileString(c_strName.toStdWString().c_str(), node.toStdWString().c_str(), nodeValue.toStdWString().c_str(), m_cofigFilePath.toStdWString().c_str());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值