Qt 读写 .ini 文件
- 嗯 百度又一大堆为啥要费时间自己写呢
- 在实际中用到了
- 方便自己看 时间久了忘记的话
- 测试环境 Qt5.12.10 QtCreator 4.13.1 MinGW32bit 虽然这个对环境没啥要求
- 以下将介绍 Qt对.ini文件读写操作的一些方法 以及个人对一些问题的尝试
- 开始正题
.ini文件
-
Initialization File 初始化文件的缩写 由节、键、值组成。 “;” 到行尾为注释
[section] ;节 key=value ;键 = 值
-
基本结构是这样 如果想更加深入的了解可以必应
使用到的库
#include <QSettings>
#include <QDebug> //用于打印输出
QSettings
在Qt里面不只是读取 .ini
文件的功能 这里不多说
写操作
void MainWindow::writeToIni()
{
QSettings *configIniWrite = new QSettings("config.ini",QSettings::IniFormat);
configIniWrite->setValue("User/user","H");
configIniWrite->setValue("User/pass","66666");
configIniWrite->setValue("addr/ip","192.168.1.1");
configIniWrite->setValue("addr/port","6000");
delete configIniWrite;
}
-
使用
QSettings
的构造函数 传入文件路径以及文件名 设置格式为QSettings::IniFormat
直接使用setValue()
设置需要写的节点 在config.ini
文件中写入结果[User] user=H pass=66666 [addr] ip=192.168.1.1 port=6000
读操作
void MainWindow::readToIni()
{
QSettings *configIniRead = new QSettings("config/config.ini",QSettings::IniFormat);
QString user = configIniRead->value("User/user").toString();
QString pass = configIniRead->value("User/pass").toString();
QString ip = configIniRead->value("addr/ip").toString();
QString port = configIniRead->value("addr/port").toString();
qDebug()<<"user:"<<user;
qDebug()<<"pass:"<<pass;
qDebug()<<"ip:"<<ip;
qDebug()<<"port:"<<port;
}
-
这里读操作获取数据 用
value()
设置需要获取的节点就行 -
把刚才写入的信息在读取出来 控制台输出
user: "H" pass: "66666" ip: "192.168.1.1" port: "6000"
-
还可以使用
allkeys
读取所有键值qDebug()<<"allkeys:"<<configIniRead->allKeys();
-
读取结果如下:
allkeys: ("User/pass", "User/user", "addr/ip", "addr/port")
-
上面的结果 使用字符串拆分
//使用 allkeys 遍历 QList<QString> keyString; keyString<<configIniRead->allKeys(); qDebug()<<"keyString:"<<keyString; QList<QList<QString>> keyList; for(int i=0;i<keyString.size();i++) { keyList<<keyString.at(i).split("/"); if(keyList.at(i).at(0) == "User") { qDebug()<<"User Key:"<<keyList.at(i).at(1)<<"Value:"<<configIniRead->value(keyString.at(i)).toString(); } if(keyList.at(i).at(0) == "addr") { qDebug()<<"addr Key:"<<keyList.at(i).at(1)<<"Value:"<<configIniRead->value(keyString.at(i)).toString(); } } qDebug()<<"keyList:"<<keyList;
-
打印调试结果:
keyString: ("User/pass", "User/user", "addr/ip", "addr/port") User Key: "pass" Value: "66666" User Key: "user" Value: "H" addr Key: "ip" Value: "192.168.1.1" addr Key: "port" Value: "6000" keyList: (("User", "pass"), ("User", "user"), ("addr", "ip"), ("addr", "port"))
-
有时候并不知道(或者程序不知道)节点名 或者数据拆分太麻烦
allkeys()
就不能满足我们的需求了 -
这时使用
childGroups()
读取QList<QString> keyGrophs; keyGrophs<<configIniRead->childGroups(); qDebug()<<"ChildGrouphs:"<<keyGrophs; configIniRead->beginGroup(keyGrophs.at(1)); //因都在节点 keyGrophs.at(1) 下 childKeys allKeys 都可访问数据 QList<QString> keyChild; keyChild<<configIniRead->childKeys(); qDebug()<<"childkeys:"<<keyChild; qDebug()<<"ip:"<<configIniRead->value(keyChild.at(0)); QList<QString> keyAll; keyAll<<configIniRead->allKeys(); qDebug()<<"keyAll:"<<keyAll; qDebug()<<"ip:"<<configIniRead->value(keyAll.at(0)); configIniRead->endGroup();
-
使用
childGroups()
读取必须用beginGroup()
表示开始endGroup()
表示结束 (没有结束的话后面QSettings 不能正常操作)configIniRead->beginGroup(keyGrophs.at(1)); //中间跟对当前节点下的读写操作 configIniRead->endGroup();
-
同时这里验证在
beginGroup()
下的操作都是当前节点allkeys()
读到的结果跟childKeys()
一致ChildGrouphs: ("User", "addr") childkeys: ("ip", "port") ip: QVariant(QString, "192.168.1.1") keyAll: ("ip", "port") ip: QVariant(QString, "192.168.1.1")
-
以上是个人实际应用测试实践结果 如有不对希望各大网友批评指正