#include "Widget.h"
#include "ui_Widget.h"
#include <QSettings>
#include <QTextCodec>
#include <QDebug>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QApplication>
#include <QFile>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
init1();
// init2();
// init3();
// init_add();
// init_add1();
// group();
// _remove();
}
Widget::~Widget()
{
delete ui;
}
/*********************************************************************1. *************************************************************/
void Widget::init1()
{
//1. 创建ini文件
QSettings iniFile(QApplication::applicationDirPath() + "/../../QSettings_01/config.ini", QSettings::IniFormat);
//2. 指定ini文件编码
iniFile.setIniCodec(QTextCodec::codecForName("utf-8"));
//3. 向配置文件中写入数据
//(1)开启组network
iniFile.setValue("network/ip", QString("192.168.21.236"));
iniFile.setValue("network/port", 8989);
iniFile.beginGroup("network");
iniFile.setValue("mask", QString("255.255.255.255"));
iniFile.setValue("thread", QString("324252352"));
iniFile.endGroup();
//(2)开启组thread
iniFile.beginGroup("thread");
iniFile.setValue("threadId1", QString("0x3424213"));
iniFile.setValue("threadId2", QString("0x1245452"));
iniFile.setValue("threadId3", QString("0x2569999"));
iniFile.endGroup();
//(3)默认情况下, 不存在组设置
iniFile.setValue("OK","Hello");
iniFile.setValue("Good", "HenHao");
iniFile.setValue("thread", "testThread");
// iniFile.remove("network/port"); //删除键
// iniFile.remove("thread"); //删除该分组
/*
iniFile.beginGroup("network"); //删除该分组
iniFile.remove("");
iniFile.endGroup();
*/
//4. 从配置文件中读取数据
qDebug() << iniFile.value("/network/ip").toString();
qDebug() << iniFile.value("/network/port").toString();
qDebug() << iniFile.value("/network/mask").toString();
qDebug() << iniFile.value("/thread/threadId1").toString();
qDebug() << iniFile.value("/thread/threadId2").toString();
qDebug() << iniFile.value("/thread/threadId3").toString();
/*
* 相关函数解析:
1. childGroups(): 返回组;
在此例子中:返回("network", "thread");
因为默认是不存在组设置的, 所以第(3)种情况下, 虽然会在ini文件中生成[General], 看起来是组, 但是并不会被该函数给返回!
2. allKeys(): 返回所有键; 存在组的,将以分层的形式返回;
本例中, 将返回
(
"Good", "OK",
"network/ip", "network/mask", "network/port",
"thread/threadId1", "thread/threadId2", "thread/threadId3"
)
3. childKeys(): 只返回("Good", "OK")
*/
qDebug() << iniFile.childGroups();
qDebug() << iniFile.allKeys();
qDebug() << iniFile.childKeys();
}
/**************************************************************************2. ********************************************************/
void Widget::init2()
{
/*
1. childKeys()函数的正确使用: 该函数是用来返回组下面的子键的;
[thread]
threadId1=0x3424213
threadId2=0x1245452
threadId3=0x2569999
比如以上组: 那么该函数返回的就是该顶级键下的子键列表(threadId1, threadId2, threadId3);
如何读取出每个顶级键下的子键?
=> 直接调用childKeys() => 返回();
参考官方案例可知, 需要配合beginGroup()/endGroup()来使用; 另外注意, beginGroup()和endGroup()一定是成双成对使用!
见下面的遍历方法;
*/
QSettings iniFile(QApplication::applicationDirPath() + "/../../QSettings_01/test.ini", QSettings::IniFormat);
//分组1
iniFile.beginGroup("thread");
iniFile.setValue("threadId1", QString("0x3424213"));
iniFile.setValue("threadId2", QString("0x1245452"));
iniFile.setValue("threadId3", QString("0x2569999"));
iniFile.endGroup();
//分组2
iniFile.setValue("network/ip", QString("192.168.21.236"));
iniFile.setValue("network/port", 8989);
iniFile.setValue("network/mask", QString("255.255.255.255"));
#ifdef _FF
iniFile.beginGroup("thread");
qDebug() << iniFile.childKeys();
iniFile.endGroup(); //***
iniFile.beginGroup("network");
qDebug() << iniFile.childKeys();
iniFile.endGroup();
/*
("threadId1", "threadId2", "threadId3")
("ip", "mask", "port")
另外如果忘写***了, 则打印结果是:
("threadId1", "threadId2", "threadId3")
()
===> 也就是说, 如果没有关闭分组, 那么会影响后面的组的子键遍历, 无法遍历出来;
*/
#else
QStringList list = iniFile.childGroups();
for(int i = 0; i < list.size(); i++) {
iniFile.beginGroup(list.at(i));
qDebug() << iniFile.childKeys();
iniFile.endGroup();
}
/*
("ip", "mask", "port")
("threadId1", "threadId2", "threadId3")
*/
#endif
}
/******************************************************************************3. ****************************************************/
void Widget::init3()
{
//如果不进行setValue(), 那么是无法生成test1.ini文件的;
QSettings iniFile(QApplication::applicationDirPath() + "/../../QSettings_01/test1.ini", QSettings::IniFormat);
iniFile.beginGroup("thread");
iniFile.setValue("threadId1", QString("0x3424213"));
iniFile.setValue("threadId2", QString("0x1245452"));
// qDebug() << iniFile.group();
iniFile.endGroup();
// qDebug() << iniFile.fileName(); //返回该配置文件的路径
// qDebug() << iniFile.format();
// qDebug() << iniFile.group(); //此函数需放置在beginGroup() ... endGroup()之间进行使用, 否则使用无效
qDebug() << iniFile.scope(); //QSettings::UserScope
}
/*******************************************4. **********************************************************************************************/
/*
* 从配置文件中读取数据:
* 法一: 通过键读取;
* 法二: 通过分组读取;
*/
void Widget::init_add()
{
//1. 方法一:
QSettings iniFile(QApplication::applicationDirPath() + "/../../QSettings_01/config.ini", QSettings::IniFormat);
qDebug() << iniFile.value("/network/ip").toString();
qDebug() << iniFile.value("/network/port").toString();
qDebug() << iniFile.value("/network/mask").toString();
qDebug() << "<<< *** >>>";
//2. 方法二:
iniFile.beginGroup("network");
qDebug() << iniFile.value("ip").toString();
qDebug() << iniFile.value("port").toString();
qDebug() << iniFile.value("mask").toString();
iniFile.endGroup();
}
/*
分目录存取:
这时,我们再次查看本地文件,则会发现C:\Users\XingWei\AppData\Roaming\About\Qt\所在目录下会生成两个文件夹"Qt5.5" 和 "Qt5.6",
并且每一个目录底下会生成对应的配置文件User.ini。
C:\Users\XingWei\AppData\Roaming\About\Qt\Qt5.5\User.ini
C:\Users\XingWei\AppData\Roaming\About\Qt\Qt5.6\User.ini
*/
void Widget::init_add1()
{
QCoreApplication::setOrganizationName(QString("About"));
QCoreApplication::setApplicationName(QString("Qt"));
QSettings settings1(QSettings::IniFormat, QSettings::UserScope,
QString("%1\\%2\\%3").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()).arg("Qt5.5"),
"User");
settings1.setValue("Name", "Qt Creator");