网站首页 > 技术文章 正文
前言
QVariant这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。
介绍
帮助文档上说:The QVariant class acts like a union for the most common Qt data types.。
QVariant 这个类型充当着最常见的数据类型的联合。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。
当然,如果支持的类型没有想要的,没关系,QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:
Q_DECLARE_METATYPE(MyClass)
示例
(1)支持的类型。对于QVariant支持的类型,可直接赋值,但是取值时,对于存入的是什么类型,取出也要为这个类型。如存入为int类型,输出为toString()
1 QVariant var;
2 var.setValue(12);
3 int data=var.toInt();
或
1 QVariant var=12;
2 int data=var.toInt();
(2)对于不支持的类型,如自己定义的结构体。由于Qt都是基于元对象系统,故要在头文件里面要注册此类属于元类型。存储用到了QVariant QVariant::fromValue(const T &value) 或 void QVariant::setValue(const T &value)。获取用到了
T QVariant::value() const,在这之前一般要bool QVariant::canConvert(int targetTypeId) const先用进行判断,是否可以转换。例子如下:
.h文件声明
1 struct MyClass{
2 int id;
3 QString name;
4 };
5 Q_DECLARE_METATYPE(MyClass)
.cpp文件定义
1 //存储数据
2 MyClass myClass;
3 myClass.id=0;
4 myClass.name=QString("LiMing");
5
6 data[0]=QString("ddd");
7 data[1]=123;
8 data[3]=QVariant::fromValue(myClass);
9
10
11 //获取数据
12 QString str=data.value(0).toString();
13 int val=data.value(1).toInt();
14
15 if(data[3].canConvert<MyClass>())
16 {
17 MyClass myClass=data[3].value<MyClass>();
18 int id=myClass.id;
19 QString name=myClass.name;
20 (3)对于不支持的C++基础数据类型,如 short char,先通过toInt()转化为int类型,然后再将int转为其原本的数据类型。
1 //-------------------------------char--------------------------
2 //char -> QVariant
3 QVariant var='B';
4 qDebug()<<var; //QVariant(int, 66)
5
6
7 // QVariant ->char
8 char channel=var.toInt();
9
10 //------------------------------short--------------------------
11 //short -> QVariant
12 short dataType=12;
13 QVariant var2=dataType;
14 qDebug()<<var2; //QVariant(int, 12)
15
16
17 //QVariant -> short
18 short temp=(short)var2.toInt();
(4)保存指针,感觉这个比较强大,也比较容易用到。如
1 //保存
2 QVariant var=QVariant::fromValue((void*)event);
3
4 //获取
5 QPaintEvent* e=(QPaintEvent*)var.value<void*>();
(5)还有种写法,用QVariant的构造函数QVariant(int typeId, const void *copy)。虽然不常用,特别是指针类型,即 QMetaType::VoidStar,和 QMetaType::QObjectStar,一般还是用fromValue。但是还是以存取QObject*为例补充下吧,
起码知道写法。
1 QObject* obj=new QObject;
2 obj->setObjectName("myObj");
3
4 //保存
5 QVariant var=QVariant(QMetaType::QObjectStar,&obj);
6
7 //提取
8 QObject* myobj=qvariant_cast<QObject*>(var);
9 if(myobj!=NULL)
10 qDebug()<<myobj->objectName();
11
12 obj->deleteLater();
猜你喜欢
- 2024-10-24 QT(17)- QNetworkAccessManager qnetworkinterface.allinterfaces
- 2024-10-24 Qt多线程的三种方法QThread qt多线程直接处理数据
- 2024-10-24 从零开始学Qt(86):TCP服务器端程序设计
- 2024-10-24 Qt Core学习日记——第九天QObjectData
- 2024-10-24 Qt智能指针--QSharedPointer qt智能指针.get和.data函数后计数会加吗
- 2024-10-24 QT(11)- QThread qt ui thread work thread
- 2024-10-24 Qt5中QOverload的用法 qt5coredll
- 2024-10-24 Qt多线程编程之QThread qt中的多线程
- 2024-10-24 Qt QModbusReply类 qty是什么单位的缩写
- 2024-10-24 Qt Core学习日记——第十一天QObject(下)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)