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. 使用protobuf编写配置文件以及读写

    .proto文件示例 message Configure { required ; required uint32 port = ; } 写配置文件 Configure config; config. ...

  2. sql基础篇

    再跟SQL谈一谈--基础篇   1.简介 2.DDL & DML 3.SELECT ①DISTINCT ②WHERE ③AND & OR ④ORDER BY 4.INSERT 5.UP ...

  3. WEB安全入门

    WEB安全入门 信息安全基础 信息安全目标 真实性:对信息的来源进行判断,能对伪造来源的信息予以鉴别, 就是身份认证. 保密性:保证机密信息不被窃听,盗取,或窃听者不能了解信息的真实含义. 完整性:保 ...

  4. synchronized简介

    synchronized简介 Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block).同步代码块包括两部分:一个作为锁对象的引用,一个作为由这个锁保护的代码块. ...

  5. java中除去字符串(String)中的换行字符(\r \n)

    有时在文本框中输入内容特别是粘贴内容时会出现一些换行符(\r\n),如下,在做字数验证或保存到数据库中时应过滤掉. str.replaceAll("\r|\n","&qu ...

  6. CNN for Visual Recognition (02)

    图像分类 参考:http://cs231n.github.io/classification/ 图像分类(Image Classification),是给输入图像赋予一个已知类别标签.图像分类是计算机 ...

  7. Fluent Nhibernate code frist简单配置

    Fluent Nhibernate code frist简单配置   前言 在以前的项目开发过程中使用nhibernate做完orm映射工具需要编写大量的xml映射文件,项目过程中往往会因为一个字段等 ...

  8. 虚拟化平台cloudstack新版本的调试

    虚拟化平台cloudstack(7)——新版本的调试 调试环境 ubuntu 12.04 JDK1.7 apache-maven-3.10 eclipse 4.2 Juno mysql 5 源码下载及 ...

  9. github 自学文档 希望可以给初学的人一些帮助

    一 .git的安装 windows下面的安装:https://git-for-windows.github.io  从这里下载完全无脑安装. 安装完成后,在开始菜单里找到"Git" ...

  10. C#中的集合类——ArrayList

    1.  ArrayList与数组 数组的长度不可变,元素的类型单一: ArrayList 实际上相当于一个可变长度的动态数组,由于集合中的元素都是object类型,元素的类型可以有多种了:与数组一样, ...