问题:成员与读/写

Q_PROPERTY: MEMBER vs READ/WRITE

本文关键字:成员 问题      更新时间:2023-10-16

我正在阅读Qt 5.5中关于Q_PROPERTY宏的文档,但我无法完全理解它。

我知道您可以在这个宏中使用关键字MEMBER或访问器READ/WRITE。如果您使用关键字MEMBER,则不必编写访问器,因为您可以使用setProperty()和property()访问您的私有数据成员(属性),就像set和get一样。

问题是:使用MEMBER和使用READ/WRITE之间有什么区别吗?你应该什么时候用一种,什么时候用另一种?

如有必要:

使用MEMBER:的示例

Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)

使用读/写示例:

Q_PROPERTY(int propX READ getX WRITE setX)

通过仔细阅读文档,我觉得有一些细微而重要的差异。

首先:

如果未指定READ访问器函数,则需要MEMBER变量关联。这使得给定的成员变量可读写,而无需创建READ和WRITE访问器函数。

这意味着,您可以使用MEMBER并依赖于自动生成的、琐碎的访问器函数,或者如果这些函数碰巧比默认函数更复杂,则可以自己定义这些函数。

换句话说,如果您的访问者函数完全相同,例如:

int propName() const { return prop; }

因此,MEMBER是好的。如果你有这样的东西,它就不会了:

int propName() const { return superComplexMathUsedToComputeProp(); }

此外,请注意:

READ、WRITE和RESET功能可以继承。它们也可以是虚拟的。

如果你正在处理一个层次结构,也许你希望它们被继承,所以也许使用READWRITE会更好。

哪个是最好的,使用什么取决于具体的问题。

MEMBER只在qt元对象系统中创建ReadProperty和WriteProperty特性(请参阅生成的moc文件)。这对于与QML接口非常有用。为了在c++中使用属性,还必须实现getter和setter。

因此:

  • 会员->仅适用于QML
  • 读取、写入、通知->C++和QML

如果你想避免编程琐碎的getter和setter,可以定义你自己的makro包装Q_PROPERTY。