参考博文: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

qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)的更多相关文章

  1. QVariant类及QVariant与自定义数据类型转换的方法

    这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值 ...

  2. 自定义数据类型使用QVariant转换的方法

    QVariant类型的放入和取出必须是相对应的,你放入一个int就必须按int取出,不能用toString(), Qt不会帮你自动转换. 数据核心无非就是一个 union,和一个标记类型的type:传 ...

  3. Q_DECLARE_METATYPE(继承QObject的类都已经自动注册),注册后的类型可以作为QVariant的自定义类型

    简介 这个宏用来注册一个类(含默认构造.默认析构.拷贝构造函数)为QMetaType类型 ,注册后的类型可以作为QVariant的自定义类型. 这个宏应该放在类或者结构体外面的下面,也可以放在一个非公 ...

  4. ArcGIS自定义工具箱-显示地图文档结构

    ArcGIS自定义工具箱-显示地图文档结构 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:显示地图文档mxd的数据组织结构,数据框,图层,表 使用方法: 地图 ...

  5. android自定义view系列:认识activity结构

    标签: android 自定义view activity 开发中虽然我们调用Activity的setContentView(R.layout.activity_main)方法显示View视图,但是vi ...

  6. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  7. 类模板、Stack的类模板实现(自定义链栈方式,自定义数组方式)

    一.类模板 类模板:将类定义中的数据类型参数化 类模板实际上是函数模板的推广,可以用相同的类模板来组建任意类型的对象集合 (一).类模板的定义 template  <类型形参表> clas ...

  8. DRF认证、自定义认证和权限、自定义权限

    源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...

  9. 制作自定义背景Button按钮、自定义形状Button的全攻略(转)

    在Android开发应用中,默认的Button是由系统渲染和管理大小的.而我们看到的成功的移动应用,都是有着酷炫的外观和使用体验的.因此,我们在开发产品的时候,需要对默认按钮进行美化.在本篇里,笔者结 ...

随机推荐

  1. C# 使用PictureBox控件--点击切换图片

    效果: 1. 2. 代码: private Boolean fals = true; /// <summary> /// 单击事件 /// </summary> /// < ...

  2. C# 课堂总结1-二进制转换

    一.目的:便于计算机表示,稳定性好,符合逻辑运算,真为1,假为0. 二.各进制表示方法: 2进制:0,1 8进制:0-7 16进制:0-9,A,B,C,D,E,F 二.转换方法: 1.各进制转换为10 ...

  3. typedef 总结

    其实在正儿八经学C语言的时候typedef用的不是很多,记得书上对它的介绍只是一笔带过.的确它的用法是很简单,但这不代表在使用的过程中不会出错,今天来个彻底的总结. 作用:用来建立新的数据类型名.(注 ...

  4. 相对路径与绝对路径构造file对象

    package file; import java.io.File; public class FileTest1 { public static void main(String[] args) { ...

  5. Nginx的500,502,504错误解决方法

    Nginx的500,502,504错误解决方法 一.解决500错误: 1.500错误指的是服务器内部错误,也就是服务器遇到意外情况,而无法履行请求. 2.500错误一般有几种情况: (1)web脚本错 ...

  6. 一、Nginx配置文件详解

    配置文件介绍 主要有两部分:分别是 main:主体部分 http{}:虚拟主机配置部分 配置指令主要以分号结尾:配置语法:directive value1 [value2 ....] 支持使用的变量 ...

  7. Linux -FHS 标准

    FHS (Filesystem Hierarchy Standard),其目的是让用户可以了解以安装软件通常放在那个文件下面. /bin 放置的是单用户维护模式下,能够被调用的命令.主要有cat,ch ...

  8. VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."解决方案

    右键工程属性 -> 配置属性 -> 生成事件 ->生成后事件,命令行中的路径加上双引号,如 copy $(ProjectDir)\export\win32\Debug\$(Proje ...

  9. CH BR13数学(啥?-a^b≡a^b mod phi(p)+phi(p)(mod p)(b>=phi(p))公式)

    啥? Beta Round #13 (数学专场) 背景 有人写了一个RSA加密给我玩. 描述 我赌5毛前面两题的内容也就开头几句话平时会用到. 还是做点具体的东西吧. 求c^d Mod N 输入格式 ...

  10. load data 方式导入的数据不可以用binlog日志进行恢复,因为binlog里面不产生insert sql语句。

    QQ群里面有人问起这个问题:    用load data 导入数据的时候,在binlog文件中记录的不是insert 语句,这样的话,如果用load data 导入数据,当需要恢复数据库的时候  bi ...