QObject的setUserData和setProperty——Qt
前言
很多时候需要界面存储一些数据或信息,这样可以根据这些数据或信息来了解或获取点什么。可以说给界面增加一个标记,让我们更容易辨识。
我之前一直习惯给列表项QListWidgetItem或者树项QTreeWidgetItem携带一些数据,比如id,用setData来实现。所以这次就想QWidget有没有类似的方法,结果就找到了setUserData。后来在mac os中重新编译时,发现setUserData不可用了,建议用setProperty替换。
用法
我现在用的Qt的版本是Qt5.9 windows,方法setUserData已经在官方的帮助文档中看不到了,只能在.h中看到他的声明;而setProperty则可以在帮助文档中看到。
下面是qobject.h文件中的声明,QT_NO_PROPERTIES和QT_NO_USERDATA应该是为了版本的兼容。
#ifndef QT_NO_PROPERTIESbool setProperty(const char *name, const QVariant &value);QVariant property(const char *name) const;QList<QByteArray> dynamicPropertyNames() const;
#endif // QT_NO_PROPERTIES#ifndef QT_NO_USERDATAstatic uint registerUserData();void setUserData(uint id, QObjectUserData* data);QObjectUserData* userData(uint id) const;
#endif // QT_NO_USERDATA
setUserData的用法
通过声明我们可以看到:要想设置用户的数据,数据则必须继承QObjectUserData,我用了结构体来存储数据
struct LevelValue:QObjectUserData {int iLevel;int iFormType; //界面类型
};
然后新建此数据对象,然后将此对象的指针交由此保存。
//设置界面等级LevelValue* data=new LevelValue;data->iLevel=2;data->iFormType=0;this->setUserData(Qt::UserRole,data);
然后同userData来获取数据,根据数据进行相应的处理。
QWidget* pCurWidget=ui->formStacked->widget(index);LevelValue *data=(LevelValue*)pCurWidget->userData(Qt::UserRole);if(data!=NULL){int iType=data->iFormType;m_latestForms[iType]=pCurWidget;}
setProperty的用法
通过上面的介绍多少觉得setUserData的方法有些别扭,特别是数据必须要继承QObjectUserData,挺不方便的,而且仅此用得到这个类吧,感觉也不通用,所以他被换掉也是有原因的。
而setProperty则方便很多:它的数据是QVariant 类型的,这个类型就像var一样的好用(这个类型我在以前的博客有介绍,点这里)。若自定义的类型记得用宏Q_DECLARE_METATYPE注册到元对象系统,枚举用Q_ENUMS注册。
通过名字,可以了解到这是设置属性,Qt中有庞大的属性系统,这个方法是动态添加属性。若想详细的了解Qt属性系统,可以通过亮大的博客了解。注意的是:如果QObject中一个指定名称的属性已经存在,并且如果给定的值与属性的类型兼容,那么,值就被存储到属性中,然后返回true。如果值与属性类型不兼容,属性的值就不会发生改变,会返回false。但是如果QObject中一个指定名称的属性不存在(例如:未用Q_PROPERTY()声明),一个带有指定名称和值的新属性就被自动添加到QObject中,但是依然会返回false。这意味着返回值不能用于确定一个属性是否被设置值,除非事先知道这个属性已经存在于QObject中。
//.h声明struct LevelValue {int iLevel;int iFormType; };Q_DECLARE_METATYPE(LevelValue)
LevelValue data;data.iLevel=2;data.iFormType=0;QVariant var=QVariant::fromValue(data);this->setProperty("LevelValue",var);
QVariant var=pCurWidget->property("LevelValue");//可加判断if(var.canConvert<LevelValue>()){LevelValue data=var.value<LevelValue>();}
结束语
以后还是用setProperty吧!
QObject的setUserData和setProperty——Qt相关推荐
- 【Qt】QObject详解
00. 目录 文章目录 00. 目录 01. 概述 02. 线程亲和性 03. 没有拷贝构造函数或赋值运算符 04. 自动连接 05. 动态属性 06. 国际化 07. 属性文档 08. 常用成员方法 ...
- 温酒读Qt:QObject中篇1—— Q_OBJECT的隐秘角落
一.Q_OBJECT 宏 的隐秘 话接上一篇链接: 温酒读Qt:QObject 序篇,今天我们来揭露下QObject的靓丽一点(别问我是3点.4点还是多少点中的一点). 对于已经浅尝Qt信号和槽函数的 ...
- QT学习总结之QObject详解
QObject简单介绍 QObject是QT框架的核心,在该对象内可以使用QT框架的信号和槽机制. 一个QObject对象创建在另一个QObject类(该类可以称作父类)中,该对象将自动将其自身添加到 ...
- Qt Quick 中 QML 与 C++ 混合编程详解
Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...
- Qt 如何实现的 Meta Object
Qt 如何实现的 Meta Object 2009-11-01 11:57 741人阅读 评论(0) 收藏 举报 qtsignalcallbackobjectclasstable (文章转贴自guil ...
- Qt Quick 之 QML 与 C++ 混合编程详解
Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...
- Hello Qt——Qt信号槽机制源码解析
基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...
- Qt Quick Qml 之QML与C++ 混合编程学习
<QML与C++ 混合编程学习> 1. 在 QML 中使用 C++ 类和对象 1) C++ 类的修改 2) 注册 QML 类型 3) 在 QML 中导入类型 4) 在 QML 创建由 C+ ...
- 使用Qt编写模块化插件式应用程序
动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...
最新文章
- 空中悬停、翻滚转身、成功着陆,我用强化学习「回收」了SpaceX的火箭
- 《数据驱动安全:数据安全分析、可视化和仪表盘》一2.3 数据帧介绍
- scala特质_Scala的特质
- android休眠后恢复线程,关于Android系统休眠后,线程的执行情况
- VSCode打开中文乱码
- 不愧是击溃服务器的男人!周杰伦《说好不哭》刷新QQ音乐单曲纪录
- Tomcat服务器搭建及测试教程,腾讯+华为+阿里面试真题分享
- EXCEL 利用替换、分列、填充功能综合整理财务数据
- 本地拒绝服务漏洞修复建议
- 最新win7/win10/XP系统下载_「装机系统」_百度云
- TFT-液晶显示屏的结构和原理
- mame4android汉化,MAME4droid
- 制作二维码过程的详解(基于python)_基于opencv+python的二维码识别
- C语言之图书管理系统(功能齐全!!!)
- java倒序输出英文句子_Java实现英文句子中的单词顺序逆序输出的方法
- 用WORD批量制作工作证件
- Verilog语言快速入门(一)
- 中国联通广州软件研究院 软件开发岗二面(技术面)
- 判断文件是否是PE文件
- 电话归属地查询接口地址