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());
}