qsettings 保存自定义结构体(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与自定义结构体相互转化)的更多相关文章
- QVariant类及QVariant与自定义数据类型转换的方法
这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值 ...
- 自定义数据类型使用QVariant转换的方法
QVariant类型的放入和取出必须是相对应的,你放入一个int就必须按int取出,不能用toString(), Qt不会帮你自动转换. 数据核心无非就是一个 union,和一个标记类型的type:传 ...
- Q_DECLARE_METATYPE(继承QObject的类都已经自动注册),注册后的类型可以作为QVariant的自定义类型
简介 这个宏用来注册一个类(含默认构造.默认析构.拷贝构造函数)为QMetaType类型 ,注册后的类型可以作为QVariant的自定义类型. 这个宏应该放在类或者结构体外面的下面,也可以放在一个非公 ...
- ArcGIS自定义工具箱-显示地图文档结构
ArcGIS自定义工具箱-显示地图文档结构 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:显示地图文档mxd的数据组织结构,数据框,图层,表 使用方法: 地图 ...
- android自定义view系列:认识activity结构
标签: android 自定义view activity 开发中虽然我们调用Activity的setContentView(R.layout.activity_main)方法显示View视图,但是vi ...
- Django自定义用户认证系统之自定义用户模型
参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...
- 类模板、Stack的类模板实现(自定义链栈方式,自定义数组方式)
一.类模板 类模板:将类定义中的数据类型参数化 类模板实际上是函数模板的推广,可以用相同的类模板来组建任意类型的对象集合 (一).类模板的定义 template <类型形参表> clas ...
- DRF认证、自定义认证和权限、自定义权限
源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...
- 制作自定义背景Button按钮、自定义形状Button的全攻略(转)
在Android开发应用中,默认的Button是由系统渲染和管理大小的.而我们看到的成功的移动应用,都是有着酷炫的外观和使用体验的.因此,我们在开发产品的时候,需要对默认按钮进行美化.在本篇里,笔者结 ...
随机推荐
- larbin是一种开源的网络爬虫/网络蜘
larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发.larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源.Lar ...
- line-height具体解释
章:浏览器与Hack].7.3.5 应用:单行文字在垂直方向居中在网页设计中,往往为了突出标题而加入背景图案.如图7-31所看到的. watermark/2/text/aHR0cDovL2Jsb2cu ...
- Savitzky-Golay滤波器(2)
前几天写过一篇介绍 Savitzky-Golay滤波器的文章, 没想到最近做项目还真的用上了. 因此就顺便写了个 C 语言的自动计算生成 SG 滤波器系数的程序.利用这里的代码可以生成任意阶数的 SG ...
- Linux进程阻塞的相关知识
1.如果驱动程序无法立即满足要求,该如何响应? 当数据不可用时,用户可能调用read:或者进程试图写入数据,但因为输出缓冲区已满,设备还未准备好接受数据.调用进程通常不会关心这类问题,程序员只会简单调 ...
- poj3819 Coverage (求直线与圆的交占直线的百分比 )
题意:给你一条直线和若干个圆,求圆与直线相交的长度占整条直线的比例 解题思路:通过定比分点的方法求出圆与直线的交占圆的比例. 第一步:(确定投影的方向是x轴还是y轴) (1)当直线的line.s(x, ...
- PHP - 拒绝低版本PHP
//判断PHP版本是否太低 if (PHP_VERSION < '4.1.0') { echo 'Version is to Low!'; exit; }
- 【笔记】《通俗详细地讲解什么是P和NP问题》的概念记录
1问题规模: 要计算或解决一个问题,该问题通常有一个大小规模,用n表示. 2算法的时间复杂度 计算次数与n的关系函数.(因为计算次数隐含时间). 3多项式时间复杂度 所有形如a*n^k+b*n^(k- ...
- Tomcat提供的安全机制
Tomcat中安全机制 BASIC认证 <login-config> <auth-method>BASIC</auth-method> </login-c ...
- zoj 1730 / poj 1455 Crazy Tea Party
这阵子都没怎么写代码,由于开学,忙于各种琐碎的事情,现在静下来了开始跟着暑假的节奏刷题了. 这道题一开是没看清题目-在寝室刷题就是效率不高... 后来才知道,题目意思是,一个环形序列,1minute可 ...
- CodeForces 462B Appleman and Card Game(贪心)
题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase ...