一、简介
Qt属性系统基于元对象Meta-Object系统,因此在使用时,需要继承QObject类并添加宏Q_OBJECT,属性除了具有类成员的功能外,还可以通过元对象系统访问,比如可以使用信号和槽机制。
二、使用方法
在继承QObject的类中,使用宏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])
先看一个官方的例子
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
public:
MyClass(QObject *parent = 0);
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
Q_ENUM(Priority)
void setPriority(Priority priority)
{
m_priority = priority;
emit priorityChanged(priority);
}
Priority priority() const
{ return m_priority; }
signals:
void priorityChanged(Priority);
private:
Priority m_priority;
};
三、Q_PROPERTY()中关键字详解
1、说明
小括号“()”中的关键字是必须实现的、中括号“[ ]”中是可选的;
2、type name 属性的类型和名字
属性类型可以是QVariant支持的任何类型,也可以是用户定义的类型;
3、READ 和 MEMBER
如果没有MEMBER,则必须要有READ。
READ 后面定义获取属性值的函数,该函数是const,如上面例子中的Priority priority() const;
WRITE 设置属性值,是可选的;
MEMBER 如果一个属性不需要 READ ,但又想使用属性系统,可以使用MEMBER来注册,MEMBER后面是成员变量的名字;
如官方例子中:
Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
signals:
void textChanged(const QString &newText);
private:
QString m_text;
4、RESET
可选,将属性设置为默认值,该RESET函数必须返回void并且不带参数。
5、NOTIFY
可选,NOTIFY 后面跟该类中已经定义的一个信号函数,只要该属性的值发生更改,就会发出该信号。这个信号函数必须采用零个或一个参数,该参数必须与属性的类型相同。
6、REVISION int
可选,版本信息(通常用于QML)。
7、DESIGNABLE bool
可选,表示属性是否能在GUI设计工具的属性编辑器中可见(例如,Qt Designer)。大多数属性是DESIGNABLE(默认为true)。
8、SCRIPTABLE bool
可选,SCRIPTABLE属性表示脚本引擎是否应该可以访问此属性(默认为true)
9、STORED bool
可选,该属性是单独存在还是从其他值中获取的。大部分是true,一个反例是QWidget::minimumWidth()的值从QWidget::minimumSize()中获取,因此它的STORED为false。
10、USER bool
可选,表示是否可以被用户所编辑。
11、CONSTANT
可选,CONSTANT表明属性值是常量,不可更改,因此不能有WRITE方法或NOTIFY信号。对于给定的对象实例,常量属性的READ方法每次调用时都必须返回相同的值。对于对象的不同实例,该常数值可以是不同的。
4、FINAL
可选,FINAL表示属性不会被派生类覆盖,在某些情况下,这可用于性能优化。