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. Head first设计模式

    使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...

  2. Go语言及Web框架Beego环境无脑搭建

    [原]Go语言及Web框架Beego环境无脑搭建 本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1.windows-386.msi,对应32位w ...

  3. SSL协议的握手过程

    SSL握手的目的 第一,客户端与服务器需要就一组用于保护数据的算法达成一致. 第二,它们需要确立一组由那些算法所使用的加密密钥. 第三,握手还可以选择对客户端进行认证. SSL 握手概述 SSL 握手 ...

  4. Backbone.js的技巧和模式

    Backbone.js的技巧和模式 Backbone.js的技巧和模式   本文由白牙根据Phillip Whisenhunt的<Backbone.js Tips And Patterns> ...

  5. HTML5 拖拽效果实现

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. cocos2d(背景图片循环滚动)

    背景图片循环滚动 使用action 实现的: 主要有两个背景图片交替循环滚动:我选的两个背景图片的宽度都是1024的 ,所以定义了#define BGIMG_WIDTH 1024 代码如下: 在Hel ...

  7. Arcglobe三维信息系统开发常见问题

    1.SDE数据库导入GDB三维图层时,发生Z值丢失 问题描述:从GDB数据库中,将一部分mutipath图层导入到SDE数据库中.用相应的arcengine程序或Arcglobe中缩放至图功能时,发现 ...

  8. JS左侧菜单-04

    <script language="javascript" type="text/javascript"> function HideShow() ...

  9. 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP

    上节我们提到了使用基于注解实现的AOP,这节我们将用基于xml配置的方式来实现的AOP. 1.首先建立一个类,作为切面类,这个类主要用来实现注解中各种通知要实现的方法. package com.yan ...

  10. 使用WCF Data Service 创建OData服务

    使用WCF Data Service 创建OData服务 在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主 ...