在标准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表示属性不会被派生类覆盖,在某些情况下,这可用于性能优化。
示例:
- 新建桌面应用程序TestProperty,父类QWidget,其他采用默认。
- 右键单击项目添加自定义类MyPropertyClass,父类QObject.
- mypropertyclass.h文件中Q_OBJECT下方声明属性宏: Q_PROPERTY(QString title READ title WRITE setTitle USER true)
4. 声明属性读取、设置函数,定义属性变更时发送的信号,定义成员变量m_mask保存属性值。
5. widget.h添加槽函数声明
6. Widget类构造函数中添加如下代码
========================================================================================================================