The property System

和其它编译器厂商一样, Qt 也提供了复杂的属性机制, 但是作为一个编译器无关、平台无关的库,Qt没有那些不被标准编译器支持的特征, 如 BCB的 __property。 Qt 的属性机制在任何平台的任何C++编译器上都能正常使用。 这是由 meta object 提供的。

Qt 属性与C++ 成员变量相同, 但它多了一些由meta object 提供的高级特性。 这通过Q_PROPERTY 关键字实现。 需要注意几点:

如果要在QML中使用属性绑定,必须定义NOTIFY。

USER 表示该属性是否能够被用户编辑。 一般一个类里只有一个USER 为true的属性。 比如 QAbstractButton::checked。 在 QItemDelegate 中能够读取和修改这个属性。

因为在宏里, 逗号表示参数分隔, 因此如果属性是 QMap类型的, 使用QMap 替代 QMap<QString, QVariant>. 为保持一致, QList<QVariant> 通常也使用 QVariantList 。

访问属性可以通过属性的get set 方法, 也可以通过 propertyName 查询。 但是前者有较高的效率并且能够在编译器提供检查。 而后者的优势在于处理那些需要在运行期确定的属性。

在setProperty 时传入不合法的QVariant, 可以删除属性。 QVariant的默认构造函数能提供一个不合法的QVariant。

Q_DECLARE_METATYPE

使用自定义类型时, 需要使用Q_DECLARE_METATYPE 把该类型注册到 meta-object中去。

如果要让一个自定义类型 CustomType 被 QMetaObject 识别, 需要为该类提供一个 默认构造函数, 一个拷贝构造函数, 一个析构函数。 它向QVariant表示自己是Type的一个 自定义类型。因此, 在使用这个宏时, Type 必须已经完成了声明的工作(能够被 Meta Object 识别)。 对于指针类型, 指针所指的类型也必须完成声明工作, 这时, 应该同时使用Q_DECLARE_OPAQUE_POINTER(Type), 可以使该类型的指针也可以被 Meta Object 识别 。

这个宏一般可以放在类的声明之后, 也可以把它放在一个private 的头文件中, 并保证每次QVariant 使用这个类型时, 都能够包含这个头文件。

这个宏能够保证该类型被所有的模板类识别, 如果在Queue Signal中使用该类型,也要先使用这个宏注册。

The property System的更多相关文章

  1. Qt 中的属性系统(Property System)

    21 人赞同了该文章 本节内容主要讲解我对 Qt 属性系统的理解.官方文档参考 The Property System. 如何理解"属性系统"这个概念? 一般我们说一个类有什么属性 ...

  2. Qt属性系统(Qt Property System)

    Qt提供了巧妙的属性系统,它与某些编译器支持的属性系统相似.然而,作为平台和编译器无关的库,Qt不能够依赖于那些非标准的编译器特性,比如__property 或者 [property].Qt的解决方案 ...

  3. Using Java SecurityManager to grant/deny access to system functions

    In Java it is possible to restrict access to specific functions like reading/writing files and syste ...

  4. JAVA之旅(二十三)——System,RunTime,Date,Calendar,Math的数学运算

    JAVA之旅(二十三)--System,RunTime,Date,Calendar,Math的数学运算 map实在是太难写了,整理得我都晕都转向了,以后看来需要开一个专题来讲这个了,现在我们来时来学习 ...

  5. Java用System读取系统相关信息、环境变量——(六)

    package Java_Test; public class System1 { public static void main(String[] args) { // TODO Auto-gene ...

  6. 6、Qt Meta Object system 学习

    原文地址:http://blog.csdn.net/ilvu999/article/details/8049908 使用 meta object system 继承自 QOject 类定义中添加 Q_ ...

  7. Qt 元对象系统(Meta-Object System)

    (转自:http://blog.csdn.net/aladdina/article/details/5496891) Qt的元对象系统基于如下三件事情: 类:QObject,为所有需要利用原对象系统的 ...

  8. Qt Meta Object system 学习

    原文地址:http://blog.csdn.net/ilvu999/article/details/8049908 使用 meta object system 继承自 QOject 类定义中添加 Q_ ...

  9. Qt 元对象系统(Meta-Object System)(不管是否使用信号槽,都推荐使用)

    Qt 元对象系统(Meta-Object System) Qt的元对象系统基于如下三件事情: 类:QObject,为所有需要利用原对象系统的对象提供了一个基类. 宏:Q_OBJECT,通常可以声明在类 ...

随机推荐

  1. Effective C++ 读书总结

    (中文第三版 侯捷 译) 这本书在C++领域也是大名鼎鼎,在微博看到有人说,如果以前学过C语言,那只需花一天时间把 Effective C++ 看一遍,然后再看 leveldb代码(http://t. ...

  2. 大数据应用日志采集之Scribe演示实例完全解析

    大数据应用日志采集之Scribe演示实例完全解析 引子: Scribe是Facebook开源的日志收集系统,在Facebook内部已经得到大量的应用.它能够从各种日志源上收集日志,存储到一个中央存储系 ...

  3. QuickSwitchSVNClient,快速完成SVN Switch的工具

    [开源]QuickSwitchSVNClient,快速完成SVN Switch的工具 在实际的开发中,我们一般使用SVN工具进行源代码的管理.在实际的产品开发中,根据项目的一些定制要求,往往需要对某一 ...

  4. Thrift RPC实战(二) Thrift 网络服务模型

    限于篇幅关系,在观察源码的时候,只列举了部分源代码 TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THs ...

  5. sql server数据库中删除的过程

    这是在vb中的一个对数据库中数据的删除过程,点击按钮后程序第一句则是将你要删除的那条记录的位置作为书签保存到myBookmark这个变量里面,然后选择确定删除的话,首先执行if语句下的第一句 mrc. ...

  6. Yellow

    Yellow这首歌让我知道了yellow这个单词出了黄色的意思外,还有胆怯的,懦弱的意思~~~ 它是Coldplay 的歌曲,歌词很简单,但是有着莫名的忧伤感,值得一提的是这首歌的MV,一个长镜头给出 ...

  7. Hibernate的clear(),flush(),evict()方法详解

    1.Clear 方法 无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存. 例: 这里虽然用了2个get方 ...

  8. Exchange Server 2013 一步步安装图解[完全步骤截图]

    前言: 这是一份为Exchange菜鸟准备的2013版本安装文档,安装环境为Windows Server 2012 DataCenter 版本,在安装之前,我对安装Exchange也是处于一无所知的状 ...

  9. Fragment与Activity交互(使用接口)

    在Fragment中: 1. // 定义一个回调接口,该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void ...

  10. 高频交易算法研发心得--WAVT指标(Warensoft交易量趋势指标)算法及应用

    高频交易算法研发心得--WAVT指标(Warensoft交易量趋势指标)算法及应用 注:WAVT指标由Warensoft(王宇)原创. 前面聊了一系列的常见应用指标,包括短线.长线的指标,并且也无耐的 ...