Q_PROPERTY:MEMBER vs READ/WRITE

Pab*_*uca 6 c++ macros qt properties member

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

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

关键是:使用MEMBER和使用READ/WRITE之间有什么区别吗?什么时候应该使用一个而另一个方式?

如有必要:

使用MEMBER的示例:

Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
Run Code Online (Sandbox Code Playgroud)

使用READ/WRITE的示例:

Q_PROPERTY(int propX READ getX WRITE setX)
Run Code Online (Sandbox Code Playgroud)

sky*_*ack 8

通过仔细阅读文档,在我看来,存在轻微,重要的差异.

首先:

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

这意味着您可以使用MEMBER和依赖自动生成的,简单的访问器函数,也可以为这些函数定义这些函数,如果它们碰巧比默认函数更复杂.

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

int propName() const { return prop; }
Run Code Online (Sandbox Code Playgroud)

因此,MEMBER很好.如果您有以下内容,则不会:

int propName() const { return superComplexMathUsedToComputeProp(); }
Run Code Online (Sandbox Code Playgroud)

另请注意:

READ,WRITE和RESET函数可以继承.它们也可以是虚拟的.

如果你正在处理一个层次结构,也许你希望它们被继承,那么可能会继续使用READ并且WRITE会更好.

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

  • 这个答案是错误的:MEMBER根本不是一般的琐碎的getter和setter. (3认同)

Lib*_*sik 5

成员在 qt 元对象系统中仅创建 ReadProperty 和 WriteProperty 功能(请参阅生成的 moc 文件)。这对于与 QML 接口很有用。为了在 C++ 中使用属性,还必须实现 getter 和 setter。

所以 MEMBER -> 仅用于 QML READ、WRITE、NOTIFY -> C++ 和 QML

如果您想避免编写简单的 getter 和 setter,请定义您自己的 makro 包装 Q_PROPERTY。