前言

很多时候需要界面存储一些数据或信息,这样可以根据这些数据或信息来了解或获取点什么。可以说给界面增加一个标记,让我们更容易辨识。

我之前一直习惯给列表项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相关推荐

  1. 【Qt】QObject详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 线程亲和性 03. 没有拷贝构造函数或赋值运算符 04. 自动连接 05. 动态属性 06. 国际化 07. 属性文档 08. 常用成员方法 ...

  2. 温酒读Qt:QObject中篇1—— Q_OBJECT的隐秘角落

    一.Q_OBJECT 宏 的隐秘 话接上一篇链接: 温酒读Qt:QObject 序篇,今天我们来揭露下QObject的靓丽一点(别问我是3点.4点还是多少点中的一点). 对于已经浅尝Qt信号和槽函数的 ...

  3. QT学习总结之QObject详解

    QObject简单介绍 QObject是QT框架的核心,在该对象内可以使用QT框架的信号和槽机制. 一个QObject对象创建在另一个QObject类(该类可以称作父类)中,该对象将自动将其自身添加到 ...

  4. Qt Quick 中 QML 与 C++ 混合编程详解

    Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...

  5. Qt 如何实现的 Meta Object

    Qt 如何实现的 Meta Object 2009-11-01 11:57 741人阅读 评论(0) 收藏 举报 qtsignalcallbackobjectclasstable (文章转贴自guil ...

  6. Qt Quick 之 QML 与 C++ 混合编程详解

    Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...

  7. Hello Qt——Qt信号槽机制源码解析

    基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...

  8. Qt Quick Qml 之QML与C++ 混合编程学习

    <QML与C++ 混合编程学习> 1. 在 QML 中使用 C++ 类和对象 1) C++ 类的修改 2) 注册 QML 类型 3) 在 QML 中导入类型 4) 在 QML 创建由 C+ ...

  9. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

最新文章

  1. 空中悬停、翻滚转身、成功着陆,我用强化学习「回收」了SpaceX的火箭
  2. 《数据驱动安全:数据安全分析、可视化和仪表盘》一2.3 数据帧介绍
  3. scala特质_Scala的特质
  4. android休眠后恢复线程,关于Android系统休眠后,线程的执行情况
  5. VSCode打开中文乱码
  6. 不愧是击溃服务器的男人!周杰伦《说好不哭》刷新QQ音乐单曲纪录
  7. Tomcat服务器搭建及测试教程,腾讯+华为+阿里面试真题分享
  8. EXCEL 利用替换、分列、填充功能综合整理财务数据
  9. 本地拒绝服务漏洞修复建议
  10. 最新win7/win10/XP系统下载_「装机系统」_百度云
  11. TFT-液晶显示屏的结构和原理
  12. mame4android汉化,MAME4droid
  13. 制作二维码过程的详解(基于python)_基于opencv+python的二维码识别
  14. C语言之图书管理系统(功能齐全!!!)
  15. java倒序输出英文句子_Java实现英文句子中的单词顺序逆序输出的方法
  16. 用WORD批量制作工作证件
  17. Verilog语言快速入门(一)
  18. 中国联通广州软件研究院 软件开发岗二面(技术面)
  19. 判断文件是否是PE文件
  20. 电话归属地查询接口地址

热门文章

  1. NUPT- BFS 算法题1048
  2. 【数据分析】数据分析方法(三):PEST 分析方法
  3. 典型环节的matlab仿真实验报告,自动控制原理实验报告
  4. 用十六进制表示浮点型常量
  5. 北京高考零分作文(看到最后一句笑喷了!)
  6. @程序员们,开发者官网惊喜上线,有奖答题等你挑战!
  7. 三井集团:永续控制产业链核心的秘密
  8. 八年级计算机考试试题及答案,八年级信息技术学科期末考试试题(开卷)
  9. 从外部JS文件中获出ASPX页面控件的ClientID
  10. YOLOX的混淆矩阵:细节上分析实验结果