从Qt帮助文档中搜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])
看了这么多,其实到目前为止,我用到的并不多,就说是常用的几个吧。
举个例子:
Q_PROPERTY(QString title READ title WRITE setTitle)
每个属性都需要可以访问,这个就定义了类似其他语言中的get和set方法。
QString表示的是类型,title是名称,READ title是读的方法
下面是需要自己定义普通成员函数和成员变量的
QString title()
{
return m_title;
}
void setTitle(const QString &title)
{
m_title = title;
}
//有个成员变量
QString m_title;
我们再看这个:
Q_PROPERTY(type name
(READ getFunction [WRITE setFunction] |
MEMBER memberName [(READ getFunction | WRITE setFunction)])
看到这个或运算符,就知道这几个是可选的。
一个Q_PROPERTY定义属性可以是只读的
Q_PROPERTY(type name READ getFunction)
可读可写的
写法一:
Q_PROPERTY(type name READ getFunction WRITE setFunction)
写法二:
Q_PROPERTY(type name MEMBER memberName)
写法三:
Q_PROPERTY(type name MEMBER memberName READ getFunction)
写法四:
Q_PROPERTY(type name MEMBER memberName WRITE setFunction)
有人说:你这不是孔乙己问茴香豆的“茴”字有几种写法么?
其实不是,我们看到写法一和写法二是最常见的,写法二最简洁,它帮我们自定义了get和set方法。
写法一的灵活度最大,get和set方法都需要我们自定义。写法三和写法四是get或者set其中的一种可以自定义。
有一种是错误的就是同时用了同一个Q_PROPERTY中既又READ和WRITE ,又有MEMBER,这种写法就多此一举了。
我们在实践中,尤其是在qml中,还有一个常用的 [NOTIFY notifySignal]
就是这个,它需要我们定义一个信号
还是用官方的帮助文档举例(在帮助目录中搜索The Property System)
Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged)
Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
...
signals:
void colorChanged();
void spacingChanged();
void textChanged(const QString &newText);
private:
QColor m_color;
qreal m_spacing;
QString m_text;
NOTIFY 定义的是属性在发生变化的时候,会发送一个这个的信号,去进行通知。
如果大家有兴趣,可以看看这篇文章里,对上面的每个属性的用法都做了说明:
Qt之自定义属性Q_PROPERTY
总结一下:到目前为止,我们知道了 READ、WRITE 、MEMBER、以及NOTIFY 的用法。
这也是我在工作中目前用到的,“少则得,多则惑”。
这里有个实例:
Qt的属性动画和串行动画组结合的先淡入再淡出的小例子
参考:
Qt之自定义属性Q_PROPERTY
QT之Qt之Q_PROPERTY宏理解
[Qt入门篇]5 Qt的属性系统——声明属性
[Qt入门篇]6 Qt的属性系统——READ/WRITE/MEMBER
[Qt入门篇]7 Qt的属性系统——NOTIFY和RESET