Qt 中用Setting写ini文件用以保存软件配置信息是个很方便的信息,一般读写单个值,都很简单,到处都可以找到资料,但对于自定义的结构体如何使用QSetting写入ini和读出,资料较少,下面是我整理且测试成功的方法.
struct myStruct{
double errorUpper;
double warnUpper;
double warnLower;
double errorLower;
};
Q_DECLARE_METATYPE(myStruct) //告诉Qt你自定的类型,可能需包含#include <QMetaType>
需重载输入输出,好像是因为读写ini文件的时候用的是数据流,具体没细研究,有同学知道也希望说明一下
QDataStream &operator<<(QDataStream &out,const myStruct str)
{
out << str.errorUpper << str.warnUpper << str.warnLower << str.errorLower;
return out;
}
QDataStream &operator>>(QDataStream &in,myStruct &str)
{
in >> str.errorUpper >> str.warnUpper >> str.warnLower >> str.errorLower;
return in;
}
注册你所定义的结构体,需要放在你需要使用的结构体的前面,如果不确定放什么位置,就放main函数中,保证在最前面
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qRegisterMetaTypeStreamOperators<myStruct>("myStruct");//注册myStruct结构体的操作流,就是重写的输入输出流
qRegisterMetaType<myStruct>("myStruct");//注册结构体
MainWindow w;
w.show();
return a.exec();
}
现在就可以进行写入和读取结构体了
void MainWindow::on_pushButton_2_clicked()
{
QSettings setting(QCoreApplication::applicationDirPath() + "/setting.ini",QSettings::IniFormat);
//setting.setIniCodec(QTextCodec::codecForName("UTF-8")); //在此添加设置,即可读写ini文件中的中文
myStruct s = {12.4,13.5,21.3,55.3};
QVariant v = QVariant::fromValue(s);
setting.setValue("Struct/myStruct",v);
}
void MainWindow::on_pushButton_3_clicked()
{
QSettings setting(QCoreApplication::applicationDirPath() + "/setting.ini",QSettings::IniFormat);
//setting.setIniCodec(QTextCodec::codecForName("UTF-8")); //在此添加设置,即可读写ini文件中的中文
QVariant v = setting.value("Struct/myStruct");
myStruct os = v.value<myStruct>();
qDebug() << os.errorUpper << os.warnUpper << os.warnLower << os.errorLower;
}
这样操作确实可以很方便的读和写入结构体,但是在ini文件中不能明码进行改写数据,
写入的结果如下
我的本意是想既能方便写入和读取结构体,又能在必要时打开ini文件手动修改,使用这种方式虽然能方便写入和读取,但修改却很不方便…