简介:在项目开发时和程序运行时我们需要保存很多数据到配置文件,不管什么开发语言都有读写配置的文件的类。这样方便了开发,节省了开发时间,提高了效率。现在来介绍我在项目中用到的QDataStream和QSettings,对比他们的有缺点,以及使用方法,下面详细介绍这两个类的使用。
第一:介绍QDataStream类的使用。
1.1、QDataStream类的所有成员函数的列表:http://www.kuqin.com/qtdocument/qdatastream.html#QDataStream
1.2、实例1(向一个流中写二进制数据):
QFile file("file.dta"); //创建文件对象,指定保存路径
file.open(QIODevice::WriteOnly); //打开文件
QDataStream sOut(&file); // 我们将把数据串行化至文件f
sOut << "this is MainWindow"; // 串行化一个字符串
sOut << (int32_t)88; // 串行化一个整数
file.close(); // 关闭文件
1.3、实例2(从一个流中读二进制数据):
QFile file("file.dta"); // 创建文件对象,指定读取路径
file.open(QIODevice::ReadOnly);
QDataStream sIn(&file); // 从文件f中读取串行化的数据
QString str;
int32_t a;
sIn >> str >> a; // 提取出“this is MainWindow”和88
1.3、实例3(向一个流中写自定义结构体二进制数据):
//自定义结构体
struct Persion
{
private:
QString sName; //姓名
int iAge; //年龄
int iHight; //身高
float fWeight; //体重
bool bSex; //性别
public:
Persion() {memset(this, 0, sizeof(*this));} //无参构造函数
Persion(QString sName, int iAge, int iHight, float fWeight, bool bSex) //有参构造函数
{
this->sName = sName;
this->iAge = iAge;
this->iHight = iHight;
this->fWeight = fWeight;
this->bSex = bSex;
}
};
QDataStream& operator<<(QDataStream &ds, const Persion &data); //重载<<运算符 写结构数据到文件
QDataStream& operator>>(QDataStream &ds, Persion &data);//重载>>运算符 读数据到结构体
由于QDataStream类没有重载( <<)有我们的自定义的数据类型,所有要重载 <<预算符。
//重载<<运算符 写结构数据到文件
QDataStream& operator<<(QDataStream &ds, const Persion &data)
{
ds << data.sName << data.iAge << data.iHight
<< data.fWeight << data.bSex;
return ds;
}
//重载>>运算符 读数据到结构体
QDataStream& operator>>(QDataStream &ds, Persion &data)
{
ds >> data.sName >> data.iAge >> data.iHight
>> data.fWeight >> data.bSex;
return ds;
}
//往文件写自定义结构体二进制数据
Persion perInfo("张三", 30, 178, 80, true); //声明一个自定义结构并初始化
QFile file("file.dta"); // 创建文件对象,指定保存路径
file.open(QIODevice::WriteOnly); // 打开文件
QDataStream sOut(&file); // 我们将把数据串行化至文件f
sOut << perInfo; // 串行化一个结构体数据到文件
file.close(); // 关闭文件
1.4、实例4(从一个流读取自定义结构体二进制数据):
Persion perInfo; //声明一个自定义结构
QFile file("file.dta"); // 创建文件对象,指定保存路径
file.open(QIODevice::ReadOnly); // 打开文件
QDataStream sIn(&file); // 我们将把数据串行化至文件f
sIn >> perInfo; // 串行化一个结构体数据到文件
file.close(); // 关闭文件
QDataStream使用总结:
1、QDataStream类提供了二进制数据到QIODevice的串行化,数据流是一个编码信息的二进制流,它与主机的操作系统、CPU或字节顺序100%的没有关系。
2、QDataStream类对QT的所有基本数据类型都重载了写运算符<<和读运算符>>。
3、如果想用QDataStream读写自定类型数据,则自己必须手动实现写运算符<<和读运算符>>
4、QDataStream类还有readBytes()和writeBytes()等接口函数可以读写文件。
5、QDataStream的优点是提供了二进制数据到QIODevice的串行化,读写速度快效率高,缺点是不能定位修改文件数据,每次只能重新读写文件。
第二:介绍QSettings类的使用。
1.1、实例1(写数据到配置文件)
//1 创建一个配置文件对象
QSettings ini("test.ini", QSettings::IniFormat);
//2 开始第一个组
ini.beginGroup("sGroup1");
//3 写数据到配置
ini.setValue("name1", "张三");
ini.setValue("age1", 30);
ini.setValue("sex1", true);
ini.setValue("hight1", 178.52);
saveIni(ini);
//4 结束第一个组
ini.endGroup();
//5 开始第二个组
ini.beginGroup("sGroup2");
//6 写数据到配置
ini.setValue("name2", "立白");
ini.setValue("age2", 80);
ini.setValue("sex2", true);
ini.setValue("hight2", 190.52);
saveIni(ini);
//7 结束第二个组
ini.endGroup();
1.2、实例2(从配置文件读取数据)
//1 创建一个配置文件对象
QSettings ini("test.ini", QSettings::IniFormat);
//2 开始第一个组
ini.beginGroup("sGroup1");
//3 从配置文件读取数据
QString sName1 = ini.value("name").toString();
int iAge1 = ini.value("age").toInt();
bool bSex1 = ini.value("sex").toBool();
float fHight1 = ini.value("hight").toFloat();
//4 结束第一个组
ini.endGroup();
//5 开始第二个组
ini.beginGroup("sGroup2");
//6 从配置文件读取数据
QString sName2 = ini.value("name2").toString();
int iAge2 = ini.value("age2").toInt();
bool bSex2 = ini.value("sex2").toBool();
float fHight2 = ini.value("hight2").toFloat();
//7 结束第二个组
ini.endGroup();
QSetings使用总结:
1、写配置文件函数原形void setValue(const QString &key, const QVariant &value),setValue()的第一个参数是一个关键,第二个参数是一个万能数据类型,关键字表示待会读取时在某个组根据关键字读取数据,万能数据类型表示只要是QT的数据类型都能保存。
2、value()函数可以根据关键字读取数据,并转为用户想要的数据类型。
3、QSetings的优点是可以根据组名和关键字修改任意项的值,缺点是要查询文件所以速度慢,效率低。