這里摘取其關鍵內容:
1、將自定義數據類型使用Q_DECLARE_METATYPE宏進行聲明,便於編譯器識別。
2、在插入對象的時候,聲明QVariant對象,使用其setValue方法添加自定義對象。
3、在讀取的時候,采用QVariant對象的value方法返回自定義對象。
寫入:
- //類型轉換
- QVariant v;
- v.setValue(MyStruct);
讀取:
- //轉換為自定義的結構體實例
- MyStruct s = v.value<MyStruct>();
參考了博文后寫了自己的結構體,但是在用qsettings讀出某一條記錄時提示錯誤:
QVariant::load: unable to load type 1055.
同時,在寫qsettings,會提示如下錯誤:
QVariant::save: unable to save type 'DownloadFinishItemInfo' (type id: 1055).(其中DownloadFinishItemInfo為自定義結構體)
針對以上問題,加入如下補充后問題得到解決:
1、在用qsettings讀出某一條記錄前需增加qRegisterMetaTypeStreamOperators的聲明;
2、需要重載關於自定義結構體的輸入和輸出操作符。
個人猜測:對於qsettings要保存自定義的結構體,其實就是保存到硬盤的配置文件中,所以需要對這個結構體有讀出和寫入的api,這里是重載輸入和輸出操作符,這樣,在用qsettings保存一條記錄的時候,就用該結構體的輸出操作符把結構體內容讀出到流,然后把流中的內容保存到文件,同樣,在用qsettings讀出一條記錄時,就需要用到該結構體的輸出操作符,把結構體內容輸出到流,然后我們才能從流中讀到該結構體的內容。
上代碼:
.h:
/*已下載的任務的信息*/
#ifndef DOWNLOADFINISHITEMINFO_H
#define DOWNLOADFINISHITEMINFO_H
#include <QMetaType>
#include <QString>
#include <QDataStream>
class DownloadFinishItemInfo
{
public:
DownloadFinishItemInfo();
QString downloadTime; //下載時間
QString softwareName; //軟件名
QString softwareIconPath;//圖標路徑
QString softwareTotalSizeStr; //總大小的字符串表示
};
Q_DECLARE_METATYPE(DownloadFinishItemInfo) //將自定義數據類型使用Q_DECLARE_METATYPE宏進行聲明,便於編譯器識別
QDataStream & operator<<(QDataStream &out, const DownloadFinishItemInfo info);
QDataStream & operator>>(QDataStream &out, DownloadFinishItemInfo &info);
#endif // DOWNLOADFINISHITEMINFO_H
.cpp:#include "downloadfinishiteminfo.h"
#include <QMetaType>
#include <QDebug>
DownloadFinishItemInfo::DownloadFinishItemInfo()
{
}
QDataStream & operator<<(QDataStream &out, const DownloadFinishItemInfo info) //定義怎么把自定義結構體的數據寫入一條qsettings
{
out << info.downloadTime.toStdString().c_str() \
<< info.softwareIconPath.toStdString().c_str() \
<< info.softwareName.toStdString().c_str() \
<< info.softwareTotalSizeStr.toStdString().c_str();
// qDebug() << "*****************" << info.downloadTime.toStdString().c_str() \
// << info.softwareIconPath.toStdString().c_str() \
// << info.softwareName.toStdString().c_str() \
// << info.softwareTotalSizeStr.toStdString().c_str();
return out;
}
QDataStream & operator>>(QDataStream &out, DownloadFinishItemInfo& info) //定義怎么把從qsettings讀出的一條數據保存到自定義結構體中
{
char *str1= new char(100);
char *str2= new char(100);
char *str3= new char(100);
char *str4= new char(100);
out >> str1;
//qDebug() << "@@@@@@@@" <<str1;
info.downloadTime.toStdString().clear();
info.downloadTime.append(str1);
out >> str2;
//qDebug() << "@@@@@@@@" <<str2;
info.softwareIconPath.toStdString().clear();
info.softwareIconPath.append(str2);
out >> str3;
//qDebug() << "@@@@@@@@" <<str3;
info.softwareName.toStdString().clear();
info.softwareName.append(str3);
out >> str4;
//qDebug() << "@@@@@@@@" <<str4;
info.softwareTotalSizeStr.toStdString().clear();
info.softwareTotalSizeStr.append(str4);
//qDebug() << "&&&&&&&&&" <<str;
//out >>&(info.downloadTime);
delete str1;
delete str2;
delete str3;
delete str4;
return out;
} -
讀取和寫入setting:
-
void DownloadProWidget::WriteDownloadFinishedTask(DownloadFinishItemInfo info)
{
//寫進配置文件(保存3天內的已下載任務)
QSettings *pSettings = new QSettings("downloadFinished.ini", QSettings::IniFormat, this);
pSettings->beginGroup("Withinthreedays");
QVariant variant;
DownloadFinishItemInfo info1;
info = info1;
variant.setValue(info);
pSettings->setValue(info.softwareName, variant);
pSettings->endGroup();
}
QList<DownloadFinishItemInfo> DownloadProWidget::ReadDownloadFinishedTask()
{
qRegisterMetaTypeStreamOperators<DownloadFinishItemInfo>("DownloadFinishItemInfo"); //關鍵,不然讀出來的都是空
//讀取配置文件(3天內的已下載任務)
QSettings *pSettings = new QSettings("downloadFinished.ini", QSettings::IniFormat, this);
//讀取所有key
QStringList keyList = pSettings->allKeys();
QList<DownloadFinishItemInfo> infoList;
//保存所有信息
int length = keyList.length();
for(int i = 0; i < length; i++)
{
QVariant variant = pSettings->value(keyList.at(i));
DownloadFinishItemInfo info = variant.value<DownloadFinishItemInfo>();
infoList.append(info);
}
return infoList;
}
http://blog.csdn.net/u013281495/article/details/50970725