从C ++代码直接读取MEMBER属性

时间:2017-08-23 12:43:56

标签: c++ qt properties qml

如果我从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代码之间是否有任何不良干扰?

2 个答案:

答案 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看起来都是一样的。