在使用中,我们常要将一些数据保存为文件的形式,完后在加载的时候,进行读取。常用的有UI界面的一些操作记录等配置文件,qt中,除了使用QSetting 外,我们还可以可以使用序列化的形式,废话不多说,直接从代码里面理解:
头文件:
#include <QtCore/QCoreApplication>
#include "qmap.h"
#include <iostream>
#include "qdebug.h"
#include "qsettings.h"
#include <qdatastream.h>
#include "qfile.h"
一:先来看映射的方式.
//自定义映射类.
/自定义映射类.
class CameroAndStandardFileC
{
public:
CameroAndStandardFileC(){}
CameroAndStandardFileC(const QString &_cameroFile,const QString &_sTardFile):
cameroFile(_cameroFile), sTardFile(_sTardFile)
{
}
QString GetCameroFile() const
{
return cameroFile;
}
QString GetsTardFile() const
{
return sTardFile;
}
private :
QString cameroFile;
QString sTardFile;
};
//宏定义一个映射的方式.
typedef QMap<QString, CameroAndStandardFileC> CameroAndStandardFileMap;
看使用方式:
int main()
{
//文件映射类设计.
CameroAndStandardFileMap StandardMap;
StandardMap["0x001"] = CameroAndStandardFileC("Camero1","Standard1");
StandardMap["0x002"] = CameroAndStandardFileC("Camero2", "Standard2");
StandardMap["0x003"] = CameroAndStandardFileC("Camero3", "Standard3");
StandardMap["0x004"] = CameroAndStandardFileC("Camero4", "Standard4");
CameroAndStandardFileMap::iterator itr;
for (itr = StandardMap.begin(); itr != StandardMap.end(); ++itr)
{
qDebug() << itr.key() << " "<< itr.value().GetCameroFile()<<" "<<itr.value().GetsTardFile();
}
}
输出:
接下来,来看自定义的序列化类
//自定义序列化类
class QSampleData : public QObject
{
public:
QSampleData();
virtual ~QSampleData();
QSampleData& operator=(const QSampleData &other);
friend QDataStream& operator>>(QDataStream&, QSampleData&);
friend QDataStream& operator<<(QDataStream&, QSampleData&);
QString cameroFile;
QString sTardFile;
};
//实现部分
QSampleData::QSampleData()
{
cameroFile = "";
sTardFile = "";
}
QSampleData::~QSampleData()
{
}
//重载了=
QSampleData &QSampleData::operator=(const QSampleData& other)
{
cameroFile = other.cameroFile;
sTardFile = other.sTardFile;
return *this;
}
//重载>>
QDataStream& operator>>(QDataStream& in, QSampleData& data)
{
in >> data.cameroFile >> data.sTardFile;
return in;
}
//重载<<
QDataStream& operator<<(QDataStream& out, QSampleData& data)
{
out << data.cameroFile << data.sTardFile;
return out;
}
//看使用情况.
int main()
{
//测试一下序列化类的一些基本方式.
//自己定义的一个类.
QSampleData data;
//写入数据
data.cameroFile = "Ex8954kdxn44";
data.sTardFile = "Ex8954kdxn44";
//创建一个文件。data
QFile file("ktfkkkkkkkkkkkkk.data");
file.open(QIODevice::WriteOnly);
//使用qt自带的QDataStream 将自定义的类写入到文件中
QDataStream out(&file);
out << data;
file.close();
//这里定义第二类,来获取文件的内存
QSampleData data2;
file.open(QIODevice::ReadOnly);
//使用Qt自带的,将上面文件中的内容,读取出来.
QDataStream in(&file);
in >> data2;
qDebug() << data2.cameroFile << " " << data2.sTardFile;
file.close();
return 0;
}
看数据结果
和我们设置的数据一样,都无需自己解析
/接下里,我们实现自定义的整个类, 来综合使用,以集成到项目中来.
这里实现自定义的类
//文件名字: QSerialDataClass.h
#pragma once
#include <qdatastream.h>
#include "qfile.h"
//这个类是可以序列化的类.
class QSerialDateClass
{
public:
QSerialDateClass();
virtual ~QSerialDateClass();
QSerialDateClass& operator=(const QSerialDateClass &other);
friend QDataStream& operator>>(QDataStream&, QSerialDateClass&);
friend QDataStream& operator<<(QDataStream&, QSerialDateClass&);
QString cameroFile;
QString sTardFile;
};
//实现类的内容:
#include "QSerialDateClass.h"
QSerialDateClass::QSerialDateClass()
{
cameroFile = "";
sTardFile = "";
}
QSerialDateClass::~QSerialDateClass()
{
}
QSerialDateClass &QSerialDateClass::operator=(const QSerialDateClass& other)
{
cameroFile = other.cameroFile;
sTardFile = other.sTardFile;
return *this;
}
QDataStream& operator>>(QDataStream& in, QSerialDateClass& data)
{
in >> data.cameroFile >> data.sTardFile;
return in;
}
QDataStream& operator<<(QDataStream& out, QSerialDateClass& data)
{
out << data.cameroFile << data.sTardFile;
return out;
}
//以上只是实现了可以序列化的类,接下来,我们将QDataStream包装以下,来达到我们使用编辑的方式.
//文件名字 SerialManageClass.h
#pragma once
#include "QSerialDateClass.h"
#include "qfile.h"
#include "qdebug.h"
#include "qdir.h"
#include <QtCore/QCoreApplication>
//这个类主要管理配置文件的类.包括配置文件的时候,序列化信息文件的写入等.
class SerialManageClass
{
public:
SerialManageClass(const QString& FileName);
virtual ~SerialManageClass();
//创建一个根文件夹.
void CreateConfigDirec(const QString direcName = QCoreApplication::applicationDirPath() + "/configDirec");
//数据序列化并保存
void setSeralData(QSerialDateClass& InData, QString configFile);
/******************************************************/
// 函数名 : getSeralData
// 功能描述 : 反序列化函数
// 参数 : OutData 传入空的数据结构
// : configFileName 为文件名字(不带路径)
// :
// 返回值 : 无
/******************************************************/
void getSeralData(QSerialDateClass& OutData, const QString& configFileName);
private:
QString filePathName; //文件路径,默认到当前bin目录下
};
//正常实现的类的.cpp文件. SerialManageClass.cpp
#include "SerialManageClass.h"
SerialManageClass::SerialManageClass(const QString& FileName)
{
//这里,我默认了其生成的路劲为当前.exe所在的目录.
QString filePath = QCoreApplication::applicationDirPath() + "/configDirec";
CreateConfigDirec(filePath); //创立一个根文件夹路径.
filePathName = QString("%1/%2").arg(filePath).arg(FileName);
}
void SerialManageClass::CreateConfigDirec(const QString direcName)
{
QDir dir;
if (!dir.exists(direcName))//判断需要创建的文件夹是否存在
{
dir.mkdir(direcName); //创建文件夹
}
}
void SerialManageClass::setSeralData(QSerialDateClass& InData, QString configFile)
{
if (configFile.trimmed().length() < 1)
{
configFile = filePathName;
}
QFile file(configFile);
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << InData;
file.close();
}
void SerialManageClass::getSeralData(QSerialDateClass& OutData, const QString& configFileName)
{
//QString FileTemp = QString("%1%2").arg(QCoreApplication::applicationDirPath() + "/configDirec/").arg(configFileName);
QFileInfo fileInfo(configFileName);
if (fileInfo.isFile()) //存在
{
//获取文件.
QFile file(configFileName);
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in >> OutData;
file.close();
}
else
{
qDebug() << "file no Exits";
}
}
SerialManageClass::~SerialManageClass()
{
}
/ok,实现了之后,我们来看看,如何调用.
//这里的main.h文件中 ,别忘了加入 #include "SerialManageClass.h"
void main()
{
qDebug() << "--------------------------";
//创建自己的要序列化的类.
QSerialDateClass qserialData;
//写入文件名字.记住,在当前目录下.
SerialManageClass manageClass("Ex77841241f");
//写入数据
qserialData.cameroFile = "CameroLL7898456";
qserialData.sTardFile = "StandardNumber114457";
//调用这个,将数据写入 Ex77841241f 这个文件中
manageClass.setSeralData(qserialData," ");
我们来读取一下这个文件的数据信息.
//创建一个类.其实大家可以自己内部维护一个这样的类.
QSerialDateClass getData2;
//文件路劲
QString strfile = QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath() + "/configDirec").arg("Ex77841241f");
//获取信息,并使用qDebug() 读取出来.
manageClass.getSeralData(getData2, strfile);
qDebug() << getData2.cameroFile << " " << getData2.sTardFile;
}
读取信息成功,下面可以将其加入到工程项目文件中了,
其实私底下学习并写了好多东西,可以写完之后,发现用不到,过段时间就忘了。等用的时候,到处找之前写的demo,又要重新看,得不偿失.