qsettings 保存自定義結構體(QVariant與自定義結構體相互轉化)


參考博文:QVariant與自定義數據類型轉換的方法。

這里摘取其關鍵內容:

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM