如何替代Q_PROPERTY?(How to override a Q_Property?)

2019-10-22 16:39发布

考虑到这些类:

Class A : public QObject {
    ...
    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)

    virtual int value() { return m_value; }
    void setValue(int v) { m_value = v; Q_EMIT valueChanged();}
    ...

};

Class B : public A {
    ...

    int value() { return m_value * 2; }

    ...
};

当属性值被访问时,A类方法被称为直接而不是B类的。

到目前为止,要解决这个明显限制我复制的属性代码,并且从每个类连接的信号。

这是最好的解决办法吗?

有谁看到潜在的问题(由于具有相同名称的属性)?

Answer 1:

从Qt文档:

读,写,和RESET功能可以继承。 它们也可以是虚拟的。 当他们在继承类在使用多重继承,他们必须来自第一继承类。

只是使存取虚拟的,他们会从虚表调用,所以你会得到正确的函数对每个不同的亚型。



Answer 2:

Q_PROPERTY ... // the same
signals:
    void valueChanged(int value);
public:
int value() const { return m_value; }
virtual void setValue(int newValue) { 
    m_value = newValue; 
    emit valueChanged( value() ); 
}


class B : public A {
public:
    void setValue(int newValue) { A::setValue(newValue *2); }
}

变种2(更好一点):

Class A {
Q_PROPERTY
signals:
    void valueChanged(int value);
public:
    int value(...
    void setValue(int value) {
        changeValue(value); // to call virtual changeValue
        emit valueChanged( m_value );
    }
protected:
    virtual void changeValue(int newValue) {
        m_value = newValue;
    }
...
}

// We dont touch public methods, but protected:
Class B : public A {
protected:
    /*virtual*/ void changeValue(int newValue) {
        A::changeValue(newValue *2);
    }
}


文章来源: How to override a Q_Property?