關於qt中,映射類,序列化數據的一點記錄.

在使用中,我們常要將一些數據保存爲文件的形式,完後在加載的時候,進行讀取。常用的有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,又要重新看,得不償失.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章