早就注意到 QSettings 提供了自定义配置文件格式的功能,却一直没怎么看。今天用了一天时间,做了个练习,特此记录一下。
拿什么练习呢?
前段时间,有网友抱怨,QSettings 的ini格式中,在section和key中的中文在文件中看到的是乱码(其实是汉字对应的utf16的转义字符)。就以此开始吧:
- 一个自定义的 .ini 格式的文件
- 文件中的 section 和 key 都可以直接显示中文
-
section 的 嵌套方式采用 [A/B/C]
- 尽可能完备一点:QVariant都能正确写入与读出
效果
一个配置文件的例子:
- [A/B]
-
emptystringlist =
-
stringlist = abc, d ef,
-
-
[General]
-
double = 3.14159
-
emptystring =
-
nullstring =
-
string = hello
-
-
[section1]
-
bytearray = @Variant(\0\0\0\xc\0\0\0\t......121)
-
point = @Variant(\0\0\0\x19\0\0\0\x64\0\0\0()
-
-
[section1/section11/section111]
-
nested = @Variant(\0\0\0\x15\0\0\0\n\0\0\0\x14), @Variant(\0\0\0\x13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)
-
-
[你好]
-
列表 = 中, 国
-
-
[你好/汉民]
-
微测 = 北京
生成该文件的代码(使用起来和标准的 IniFormat 没有区别,自己想换个格式还是蛮方便的):
- #include <QtCore/QCoreApplication>
-
#include <QtCore/QDebug>
-
#include <QtCore/QPoint>
-
#include "custom.h"
-
-
int main(int argc, char *argv[])
-
{
-
QCoreApplication a(argc, argv);
-
QSettings::Format format = QSettings::registerFormat("ini", IniReadFunc, IniWriteFunc);
-
QSettings settings("config.ini", format);
-
-
settings.setValue("string", "hello");
-
settings.setValue("emptystring", "");
-
settings.setValue("nullstring", QString());
-
settings.setValue("double", 3.14159);
-
-
settings.beginGroup("section1");
-
settings.setValue("point", QPoint(100, 40));
-
settings.setValue("bytearray", QByteArray("......121"));
-
settings.endGroup();
-
-
settings.setValue("section1/section11/section111/nested",
-
QVariantList()<<QSize(10,20)<<QRect(0,0,1,1));
-
-
settings.beginGroup("A");
-
settings.beginGroup("B");
-
settings.setValue("stringlist", QStringList()<<"abc"<<"d ef"<<"");
-
settings.setValue("emptystringlist", QStringList());
-
settings.endGroup();
-
settings.endGroup();
-
-
settings.beginGroup(QString::fromLocal8Bit("你好"));
-
settings.setValue(QString::fromLocal8Bit("汉民/微测"), QString::fromLocal8Bit("北京"));
-
settings.setValue(QString::fromLocal8Bit("列表"), QStringList()
-
<< QString::fromLocal8Bit("中")
-
<< QString::fromLocal8Bit("国"));
-
settings.endGroup();
-
-
return a.exec();
-
}
如何实现
如何用操作我们自己定义格式的配置文件呢?
从前面的代码也可以看出:注册自定义格式,使用的是 registerFormat 函数:
- Format QSettings::registerFormat ( const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive ) [static]
该函数的中间两个参数,是两个函数指针。我们的任务就是实现这两个函数:一个负责读文件,一个负责写文件