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

参考博文:QVariant与自定义数据类型转换的方法。api

这里摘取其关键内容:app

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

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

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

写入:orm

    • //类型转换  
    • QVariant v;  
    • v.setValue(MyStruct); 

       

      读取:对象

       

    • //转换为自定义的结构体实例  
    • MyStruct s = v.value<MyStruct>(); 


      参考了博文后写了本身的结构体,可是在用qsettings读出某一条记录时提示错误:blog

      QVariant::load: unable to load type 1055.three

      同时,在写qsettings,会提示以下错误:字符串

      QVariant::save: unable to save type 'DownloadFinishItemInfo' (type id: 1055).(其中DownloadFinishItemInfo为自定义结构体)



      针对以上问题,加入以下补充后问题获得解决:

      一、在用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

相关文章
相关标签/搜索