QVariantMap 和 QVariant
typedef QVariantMap
Synonym for(同义词) QMap<QString, QVariant>.
QVariant类型的放入和取出必须是相对应的,你放入一个int就必须按int取出,不能用toString(), Qt不会帮你自动转换。
QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。QVariant还能保存很多集合类型,如QMap<QSTRING, QVariant>, QStringList和QList。item view classes,数据库模块和QSettings都大量使用了QVariant类,,以方便我们读写数据。
QVariant也可以进行嵌套存储,例如

1 QMap<QString, QVariant> pearMap;
2 pearMap["Standard"] = 1.95;
3 pearMap["Organic"] = 2.25;
4
5 QMap<QString, QVariant> fruitMap;
6 fruitMap["Orange"] = 2.10;
7 fruitMap["Pineapple"] = 3.85;
8 fruitMap["Pear"] = pearMap;

QVariant被用于构建Qt Meta-Object,因此是QtCore的一部分。当然,我们也可以在GUI模块中使用,例如
QIcon icon("open.png");
QVariant variant = icon;
// other function
QIcon icon = variant.value<QIcon>();
我们使用了value()模版函数,获取存储在QVariant中的数据。这种函数在非GUI数据中同样适用,但是,在非GUI模块中,我们通常使用toInt()这样的一系列to...()函数,如toString()等。
如果你觉得QVariant提供的存储数据类型太少,也可以自定义QVariant的存储类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面(Q_DECLARE_METATYPE(MyClass)宏的位置:头文件,类声明后):

1 要使用一个自定义类型可用于QVariant中只需要在类声明的后面加上:Q_DECLARE_METATYPE(),
2 struct MyClass
3 {
4 QString name;
5 int age;
6 }
7 Q_DECLARE_METATYPE(MyClass)
8
9
10 这样我们的类就可以像QMetaType::Type类一样使用没什么不同,有点不同的是使用方法上面只能这样使用.
11 MyClass myClass;
12 QVariant v3 = QVairant::fromValue(myClass);
13 //
14 v2.canConvert<MyClass>();
15 MyClass myClass2 = v2.value<MyClass>();

例如:
Q_DECLARE_METATYPE(BusinessCard)
然后我们就可以使用:

1 BusinessCard businessCard;
2 QVariant variant = QVariant::fromValue(businessCard);
3 // ...
4 if (variant.canConvert<BusinessCard>()) {
5 BusinessCard card = variant.value<BusinessCard>();
6 // ...
7 }

由于VC 6的编译器限制,这些模板函数不能使用,如果你使用这个编译器,需要使用qVariantFromValue(), qVariantValue()和qVariantCanConvert()这三个宏。
如果自定义数据类型重写了<<和>>运算符,那么就可以直接在QDataStream中使用。不过首先需要使用qRegisterMetaTypeStreamOperators().宏进行注册。这就能够让QSettings使用操作符对数据进行操作,例如qRegisterMetaTypeStreamOperators<BusinessCard>("BusinessCard");
转自:http://blog.csdn.net/zhangbinsijifeng/article/details/50686753
在使用VC、Delphi编写用户界面程序的时候,经常会把对象与控件的data域进行绑定,便于程序运行中读写提高效率。然而在Qt编程中怎么实现这个功能呢?比如将一个用户自定义的结构体与QComboBox控件的data绑定?
Qt的联机帮助做的实在是差强人意,示例代码太少了。调试了半天,看到这篇文章给了我提示。主要步骤如下:
1、将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别。
2、在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象。
3、在读取的时候,采用QVariant对象的value方法返回自定义对象。
示例代码如下:
1、自定义结构体及元类型声明:

1 struct MyStruct
2 {
3 int a;
4 char b[10];
5 };
6 MyStruct stu;
7
8 Q_DECLARE_METATYPE(MyStruct)

2、在程序初始化中,给结构体初始化并存储到QComboBox的data域中:

1 bzero(&stu, sizeof(MyStruct)); //stu就是上面声明的全局变量
2 //赋初值
3 stu.a = 100;
4 strcpy(stu.b,"Hello./n");
5 //类型转换
6 QVariant v;
7 QString ss = QString("%1").arg(stu.b);
8 v.setValue(stu);
9 //保存到控件data中
10 ui->cboTest->addItem(ss, v);
11 ui->cboTest->addItem("aadkjf", 0);

3、读取的时候反过来处理,如下:
1 QVariant v;
2 //从控件data域取得variant对象
3 v = ui->cboTest->itemData(0);
4 //转换为自定义的结构体实例
5 MyStruct s = v.value<MyStruct>();
6 printf("value=%d:%s/n",s.a, s.b);
转自:http://blog.csdn.net/derryzhang/article/details/5114491
QVariantMap 和 QVariant的更多相关文章
- Qt and C++ Reflection,利用Qt简化C++的反射实现
如何在C++中实现反射机制,应该算是C++开发中经常遇到的问题之一.C++程序没有完整的元数据,也就无法实现原生的反射机制.从性能的角度讲,这样的设计不难理解,毕竟在运行时储存这些元数据需要额外的开销 ...
- 数据库访问工具 DBUtl(公孙二狗)
数据库访问工具 DBUtil DBUtil 用于简化数据库的访问,只要准备好配置文件,调用 DBUtil 的静态函数就能直接得到查询数据库的结果. 本文主要内容有: 数据库访问的思考 DBUtil 实 ...
- QVariant实质 (类似 C#中的装箱拆箱)
QVariant是一种可以存储不同类型的数据结构,在很多场合这是很有用得为了达到这种目的,可以想象,该对象应该存储对象的类型信息,数据信息以及其他辅助详细考虑用途,这种对象必须支持对不同对象的存储,对 ...
- Qt的QVariant类
QStandardItemModel类中的函数 bool setData(const QModelIndex &index, const QVariant &value, int ro ...
- QVariant实质
QVariant实质 QVariant是一种可以存储不同类型的数据结构,在很多场合这是很有用得为了达到这种目的,可以想象,该对象应该存储对象的类型信息,数据信息以及其他辅助详细考虑用途,这种对象必须支 ...
- QVariant与自定义数据类型转换的方法
在使用VC.Delphi编写用户界面程序的时候,经常会把对象与控件的data域进行绑定,便于程序运行中读写提高效率.然而在Qt编程中怎么实现这个功能呢?比如将一个用户自定义的结构体与QComboB ...
- QVariant类学习(非常强大的类型,甚至能处理QMap<QString ,QVariant>)
详细描述: QVariant类作为一个最为普遍的Qt数据类型的联合. 因为c++禁止没有构造函数和析构函数的联合体,许多继承的Qt类不能够在联合体当中使用.(联合体当中的变量共用一个存储区),没有了联 ...
- QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)
=QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ...
- qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)
参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVa ...
随机推荐
- Python——成员变量
一.类变量 在类命名空间内定义的变量就属于类变量,python允许使用类来修改.读取类变量. 例: class a: b = '我是类变量' def c(self): print (a.b) # 通过 ...
- Java QuickSelect
Java QuickSelect /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternationa ...
- 扩展 MongoDB.Driver 支持实体
针对MongoDB的官方C#驱动进行扩展 一.安装 Install-Package Apteryx.MongoDB.Driver.Extend 移步我的项目https://github.com/cod ...
- Spark机器学习基础-无监督学习
0.K-means from __future__ import print_function from pyspark.ml.clustering import KMeans#硬聚类 #from p ...
- 什么是HTTPS协议
一 HTTPS协议一直是web开发,无论前后端都不可或缺的重要知识点,然而由于历史原因,这个协议和知识点枯燥而繁多,如果看书和文字十分难懂苦涩.但又不得不掌握,怎么办呢? 正好,从朋友小灰那里得到一片 ...
- 在Eclipse配置Tomcat服务器+JSP实例创建
欢迎任何形式的转载,但请务必注明出处. 1.jdk安装及环境配置 点击进入教程 2.Eclipse安装 点击进入官网下载 注意下载完成打开.exe后,出现的界面,有很多版本供选择.选择下图版本 3.T ...
- Python 自己实现可迭代对象
import time from collections import Iterable from collections import Iterator class Classmate(object ...
- 二、详解mysql数据类型
一.主要内容 1.介绍mysql中常用的数据类型 2.mysql类型和java类型对应关系 3.数据类型选择的一些建议 二.mysql的数据类型 主要包括以下五大类 整数类型:bit bool t ...
- Android笔记(二十五) ListView的缓存机制与BaseAdapter
之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...
- Python基础Day5
一.字典 ①字典是python的基础数据类型之一 ②字典可以存储大量的数据,关系型数据 ③字典也是python中唯一的映射类的数据类型 字典是以键值对的形式存在的,{键:值} 字典的键必须是不可变的数 ...