1. 概念

Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property]。Qt可以在任何平台上的标准编译器下编译。Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙。

Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。

Q_PROPERTY(type nameREAD getFunction[WRITE setFunction][RESET resetFunction][NOTIFY notifySignal][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL])

2. 属性

Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(bool animation READ getAnimation WRITE setAnimation)
Q_PROPERTY(QColor barColor READ getBarColor WRITE setBarColor)
  • 一个属性的行为就像类的数据成员,但是它还具有附加的特性,这些特性可以被元数据对象系统操作。这些特性是:
    需要一个READ访问器函数。用于读属性的值。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。例如,QWidget::focus是一个只读的属性,它对应一个读函数:QWidget::hasFocus()。
  • 一个可选的WRITE访问器函数。它用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。例如:QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例如,QWidget::focus没有对应的写函数。
  • 一个可选的RESET函数。用于设置属性的值到它的默认值。例如:QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它也具有一个RESET函数,QWidget::unsetCursor()。RESET函数必须返回void并且不带有任何参数。
  • 一个可选的NOTIFY信号。如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。
  • 一个DESIGNABLE变量表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了为这个变量传入true或false,你还可以指定一个bool型的成员函数。
  • SCRIPTABLE变量表明这个属性是否可以被一个脚本引擎操作(默认是true)。你也可以赋予它true或false或bool型函数。
  • STORED变量表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。大多数属性都是需要保存的,但是,如QWidget::minimumWidth()就是不被保存的,因为它的值是从另一个属性QWidget::minimumSize()得来的。
  • USER变量表明属性是否被设计为面向用户的或用户可修改的类属性。通常,每个类只有一个USER属性。例如,QAbstractButton::checked是按钮类的用户可修改属性。注意QItemDelegate获取和设置widget的USER属性。
  • CONSTANT的出现表明属性的值是不变的。对于一个object实例,常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。
  • FINAL变量的出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不是被moc强制的。程序员必须永远注意不能重写一个FINAL属性。

READ,WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时,它们必须出现在第一个被继承的类中。

属性的类型可以是被QVariant支持的所有类型,也可以是用户定义的类型。在下面的例子中,类QDate被当作用户自定义类型。

Q_PROPERTY(QDate data READ getDate WRITE setDate)

因为QDate是用户定义的,你必须包含<QDate>头文件。

对于QMap,QList和QValueList属性,属性的值是一个QVariant,它包含整个list或map。注意Q_PROPERTY字符串不能包含逗号,因为逗号会划分宏的参数。因此,你必须使用QList作为属性的类型而不是QMap<QString,QVariant>。为了保持一致性,也需要用QList和QValueList而不是QList<QVariant>和QValueList<QVariant>。

3. 一个使用实例

class BarRuler : public QWidget
{Q_OBJECT    Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)public:explicit BarRuler(QWidget *parent = 0);~BarRuler();private:    double minValue;public:    double getMinValue()            const;public slots:void setRange(double minValue, double maxValue);
};
#include "barruler.h"BarRuler::BarRuler(QWidget *parent) : QWidget(parent)
{    minValue = 0;
}BarRuler::~BarRuler()
{
}double BarRuler::getMinValue() const
{return this->minValue;
}void BarRuler::setMinValue(double minValue)
{this->minValue = minValue;update();
}

qt介绍03——Q_PROPERTY相关推荐

  1. Qt入门教程-Qt介绍-01

    Qt介绍 什么是Qt: 1. qt是C++的集成开发环境. 2. qt里面集成了各种基础类,大大减轻了工作负担3. qt使用一种简单,易懂的结构来使编程工作变得高效率,快捷 程序执行过程: 由main ...

  2. Qt工作笔记-Qt之自定义属性Q_PROPERTY

    QT提供了一个成熟的属性系统,但是作为一个跨平台的且与编译器无关的库,qt不依赖于非标准的编译器功能例如 __property or [property]: QT的强大之处在于它可以支持任何标准的c+ ...

  3. Qt之自定义属性Q_PROPERTY

    Qt提供了一个绝妙的属性系统.跟那些由编译器提供的属性差不多.然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property].Qt可以在任何平台上 ...

  4. qt介绍06——QMAKESPEC

    1. qmake qmake是用来为不同的平台的开发项目创建Makefile的Trolltech开发一个易于使用的工具.手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合 ...

  5. Qt介绍1---QPA(Qt Platform Abstraction)

    Qt是一个夸平台的库(一直宣称"Qt everywhere"),但是Qt底层不是夸平台的.比如:Qt中Gui部件的核心类QWidget,该类除了qwidget.h 和 qwidge ...

  6. Lifeline功能介绍03——课堂信息的查询

    "Lifeline功能介绍"系列博客主要介绍目前为止已经实现的网站功能,包括:日历及时间轴的查看.个人事件的添加.课堂信息的查询,以及个人课程的查看及管理等. 本篇介绍--课堂信息 ...

  7. SDL2函数简单介绍03

    本篇介绍一下,前面两章中用到的枚举值 1.SDL_WindowFlags SDL_WINDOW_FULLSCREEN 全屏fullscreen window SDL_WINDOW_FULLSCREEN ...

  8. python中itertools模块介绍---03

    2019独角兽企业重金招聘Python工程师标准>>> product(*iterables[,repeat]): 源代码: def product(*args,**kwds):po ...

  9. IOS 发布被拒 PLA 1.2问题 整个过程介绍 03 个人账户升级公司账户

    根据上一篇文章,提交的邮件,苹果给我回了一封邮件 如下: 您好: 感谢您参与 Apple 开发者计划支持.我是 XXXX,非常荣幸协助您. 我们随时都可以开始将您的个人会员资格迁移到组织会员资格.首先 ...

最新文章

  1. 解决Python通过pip安装报错:(有图)Could not install packages due to an EnvironmentError: HTTPSConnectionPool
  2. nrf52832芯片资料_蓝牙大举进军智能楼宇、智慧工业等新兴领域,主流BLE芯片哪家强...
  3. 如何查看域控是谁,域控是哪台机器
  4. bvp解算器是什么_几种飞控的姿态解算算法
  5. 再说变体结构 - 回复 彬 的问题
  6. C#图片处理之:最简单的柔化算法
  7. 用系统工具sxstrace检查缺少的VC运行时组件
  8. 值得学习的言语 | 对话技巧 | 开场白
  9. 重构——46令函数携带参数(Parameterize Method)
  10. windows下制作macos安装u盘_制作MacOS系统启动盘教程以及安装教程
  11. c语言海报,C语言 竞选海报
  12. 回忆过去,畅想未来--2016下
  13. salesforce的前世今生
  14. JAVA通过Hutool解析CSV文件【导入即用,无需封装】
  15. 计算机网络胡工程施工税率,弱电项目增值税6%、9%、13%税率怎样区分?项目经理必知...
  16. 深度剖析Linux内核(ARM体系结构)
  17. 不会有人运营独立站还不知道聊天机器人吧?五分钟带你深入了解AI聊天机器人!
  18. 软件测试-offer选择,自研or外包
  19. 数字高程模型的提出、演变、重要性及定义
  20. Lingo入门- 求解LP问题实例1

热门文章

  1. 【信息学竞赛真题! ! !】信息学竞赛人必看的「NOIP2011」铺地毯 题解(C++版)
  2. 【读书笔记】《视觉SLAM十四讲(高翔著)》 第13讲
  3. 听音乐看节目是计算机的什么,2014家用电脑既能听音乐又能看影视节目 .doc
  4. jquery ajax 覆盖,jQuery Ajax,覆盖onreadystatechange处理程序
  5. 接口响应时间长排查,通过nginx日志查看接口响应时间
  6. 谁在synopsys vdk里搭建过基于cortex-a55和cortex-a76的平台,并在上面成功跑过linux?
  7. Python 3 字符串 rstrip( ) 方法(转载)
  8. java分布式系统架构图,2022吊打面试官系列
  9. const(constant)
  10. “风口”只是一方面,看家电电商如何玩转立体化营销问鼎第一渠道