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