如果我从C ++代码中读取与某些public :
相对应的数据成员(在Q_PROPERTY
部分中定义),如果Q_PROPERTY
为非CONSTANT
{,则有任何缺点吗? {1}}没有MEMBER
?
READ
使用class Value
: public QObject
{
Q_OBJECT
Q_PROPERTY(int x MEMBER x NOTIFY xChanged)
public :
Value(QObject * const parent)
: QObject{parent}
{ ; }
int x = 0;
Q_SIGNALS :
void xChanged(int x);
};
//...
Value v;
//...
std::cout << v.x;
来写是有吸引力的,因为在案例中会自动调用v.setPropery("x", 123);
。但是每当我只想从C ++代码中读取属性的值时,编写Q_EMIT xChanged(123);
而不是v.property("x")
是很烦人的。顺便说一句,在运行时,它不是最佳的,我确定。
在直接读取上述类的数据成员的情况下,C ++和Javascript / QML代码之间是否有任何不良干扰?
答案 0 :(得分:1)
在直接读取上述类的数据成员的情况下,C ++和Javascript / QML代码之间是否有任何不良干扰?
没有。没有。但是你应该有一个访问者,而不是直接暴露成员:
class Value : public QObject
{
Q_OBJECT
Q_PROPERTY(int x MEMBER m_x NOTIFY xChanged)
int m_x = {};
public :
Value(QObject * parent = {}) : QObject{parent} {}
int x() const { return m_x; }
Q_SIGNAL void xChanged(int);
};
答案 1 :(得分:-1)
在Q_PROPERTY中使用MEMBER是完全正确的,因为知道这样做会在读取或写入属性时失去执行代码的位置。
请记住,您可以使用混合方法,使用MEMBER,但也指定READ或WRITE,如文档中所述。
Q_PROPERTY(type name MEMBER memberName [(READ getFunction | WRITE setFunction)])
您最初可以使用MEMBER,如果您需要读/写挂钩,可以稍后添加getter / setter。
使用关键字MEMBER,有助于避免无用的样板,空的getter和setter看起来都是一样的。