Q_PROPERTY:成员与 READ/WRITE

Q_PROPERTY: MEMBER vs READ/WRITE

我正在阅读有关 Q_PROPERTY 宏的 Qt 5.5 文档,但我对它的理解还不够。

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

重点是:使用MEMBER和使用READ/WRITE有区别吗? 什么时候应该使用一种,什么时候使用另一种?

如有必要:

使用 MEMBER 的示例:

Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)

使用 READ/WRITE 的示例:

Q_PROPERTY(int propX READ getX WRITE setX)

通过仔细阅读 documentation,在我看来,两者之间存在细微的重要差异。

首先:

A MEMBER variable association is required if no READ accessor function is specified. This makes the given member variable readable and writable without the need of creating READ and WRITE accessor functions.

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

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

int propName() const { return prop; }

这样,MEMBER就可以了。如果你有类似的东西,它不会:

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

另外,请注意:

The READ, WRITE, and RESET functions can be inherited. They can also be virtual.

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

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

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

所以 MEMBER -> 仅适用于 QML 读、写、通知 -> C++ 和 QML

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