【问题标题】:Q_PROPERTY: MEMBER vs READ/WRITEQ_PROPERTY:成员与读/写
【发布时间】:2016-03-24 19:40:59
【问题描述】:

我正在阅读关于 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)

使用读/写的例子:

Q_PROPERTY(int propX READ getX WRITE setX)

【问题讨论】:

    标签: c++ qt properties macros member


    【解决方案1】:

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

    首先:

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

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

    换句话说,如果你的访问器函数都是一样的,例如:

    int propName() const { return prop; }
    

    因此,MEMBER 很好。如果你有类似的东西,它不会:

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

    另外,请注意:

    READ、WRITE 和 RESET 函数可以被继承。它们也可以是虚拟的。

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

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

    【讨论】:

    • 非常感谢。终于和我想的一样了,不过还是把它搞清楚吧:)
    • @Pablo 欢迎您,我承认有时必须阅读文档两次才能完全理解选择背后的目的以及它将如何影响我们的代码库。就我个人而言,我更喜欢使用 READ/WRITE 访问器函数,因为至少对我而言,只需查看代码就更容易理解代码中发生了什么。
    • @skpjack 我的问题是,有时当我阅读文档时,我会感到迷茫。它理所当然地认为你知道并理解“底层事物”。文档对于经验丰富的人来说非常有效,但刚开始使用框架的人可能会感到迷茫。
    • 这个答案是错误的:MEMBER 根本不是一般琐碎的 getter 和 setter。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多