关于qt中,映射类,序列化数据的一点记录.

15 篇文章 0 订阅

在使用中,我们常要将一些数据保存为文件的形式,完后在加载的时候,进行读取。常用的有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,又要重新看,得不偿失.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值