qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lengyuezuixue/article/details/82502488

    1、将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别。

    2、在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象。

    3、在读取的时候,采用QVariant对象的value方法返回自定义对象。

.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;
}

猜你喜欢

转载自blog.csdn.net/lengyuezuixue/article/details/82502488