问题:成员与读/写
Q_PROPERTY: MEMBER vs READ/WRITE
我正在阅读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功能可以继承。它们也可以是虚拟的。
如果你正在处理一个层次结构,也许你希望它们被继承,所以也许使用READ
和WRITE
会更好。
哪个是最好的,使用什么取决于具体的问题。
MEMBER只在qt元对象系统中创建ReadProperty和WriteProperty特性(请参阅生成的moc文件)。这对于与QML接口非常有用。为了在c++中使用属性,还必须实现getter和setter。
因此:
- 会员->仅适用于QML
- 读取、写入、通知->C++和QML
如果你想避免编程琐碎的getter和setter,可以定义你自己的makro包装Q_PROPERTY。
- 静态数据成员的问题-修复链接错误会导致编译器错误
- constexpr构造函数需要常量成员函数时出现问题
- 使用静态成员声明类时遇到问题
- 尝试将向量初始化为类成员时出现问题
- 当成员值从指针更改为非指针时,C++常量问题
- 常量公共成员有什么问题?
- 修改C++结构的特征成员时出现问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 成员函数中的迭代器出现问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- 关于在成员重载中使用 std::move() 的问题
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 消除 C++ 中的菱形问题以访问顶级成员
- 使用 Swig 在成员中包装具有互斥锁的 C++ 类时出现问题
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- OpenCV C++ Mat 类行和列 - 它们是成员变量(和相关问题)吗?
- 奇怪的C++访问私人成员问题
- 模板成员问题
- Windows编程:WNDCLASS结构:hIcon成员问题