Fork me on GitHub

Qt 动态属性系统

在标准C++中,为了保证封装性,我们经常声明一个私有变量,然后声明两个公有函数,即set函数和get函数。在Qt中我们可以使用宏 Q_PROPERTY() 宏来实现这些。一个属性可以使用常规函数 QObject::property() 和 QObject::setProperty() 进行读写,不用知道属性所在类的任何细节,除了属性的名字。

Q_PROPERTY() 原型:

// 中括号中的内容为可选项

Q_PROPERTY(
        type name            //属性的类型 名字 (READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)]) [RESET resetFunction] [NOTIFY notifySignal]    //通知的信号名 [REVISION int]        //版本号 [DESIGNABLE bool]      //当前该属性可不可以在设计模式设置 [SCRIPTABLE bool]      //可以不可以被脚本访问 [STORED bool]         //属性值是否存储 [USER bool]          //是否提供给用户编辑权限 [CONSTANT]          //常量 [FINAL]            //不能被重写
      )

1. type name 

属性类型可以是QVariant支持的任何类型,也可以是用户定义的类型;

2. READ 和 MEMBER
如果没有MEMBER,则必须要有READ。
READ 后面定义获取属性值的函数,该函数是const;
WRITE 设置属性值,是可选的;
MEMBER 如果一个属性不需要 READ ,但又想使用属性系统,可以使用MEMBER来注册,MEMBER后面是成员变量的名字;

3. RESET

可选,将属性设置为默认值,该RESET函数必须返回void并且不带参数。

4. NOTIFY

可选,NOTIFY 后面跟该类中已经定义的一个信号函数,只要该属性的值发生更改,就会发出该信号。这个信号函数必须采用零个或一个参数,该参数必须与属性的类型相同。

5. REVISION int
可选,版本信息(通常用于QML)。

6. DESIGNABLE bool
可选,表示属性是否能在GUI设计工具的属性编辑器中可见(例如,Qt Designer)。大多数属性是DESIGNABLE(默认为true)。

7. SCRIPTABLE bool
可选,SCRIPTABLE属性表示脚本引擎是否应该可以访问此属性(默认为true)

8. STORED bool
可选,该属性是单独存在还是从其他值中获取的。大部分是true,一个反例是QWidget::minimumWidth()的值从QWidget::minimumSize()中获取,因此它的STORED为false。

9. USER bool
可选,表示是否可以被用户所编辑。

10. CONSTANT
可选,CONSTANT表明属性值是常量,不可更改,因此不能有WRITE方法或NOTIFY信号。对于给定的对象实例,常量属性的READ方法每次调用时都必须返回相同的值。对于对象的不同实例,该常数值可以是不同的。

11. FINAL
可选,FINAL表示属性不会被派生类覆盖,在某些情况下,这可用于性能优化。

示例:

  1. 新建桌面应用程序TestProperty,父类QWidget,其他采用默认。
  2. 右键单击项目添加自定义类MyPropertyClass,父类QObject.
  3. mypropertyclass.h文件中Q_OBJECT下方声明属性宏:   Q_PROPERTY(QString title READ title WRITE setTitle USER true)

  

 

 

  4. 声明属性读取、设置函数,定义属性变更时发送的信号,定义成员变量m_mask保存属性值。

  

 

   5. widget.h添加槽函数声明

  

 

   6. Widget类构造函数中添加如下代码

  

  

 

 

 

 

========================================================================================================================

 

posted @ 2021-03-27 18:53  索智源  阅读(1048)  评论(0编辑  收藏  举报