如何覆盖Q_Property?

时间:2015-04-16 18:40:53

标签: qt polymorphism override qt5.4 qproperty

考虑这些课程:

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类。

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

这是最好的解决方案吗?

是否有人发现潜在问题(由于属性具有相同名称)?

2 个答案:

答案 0 :(得分:5)

来自Qt文档:

  

可以继承READ,WRITE和RESET函数。他们也可以   是虚拟的。当它们在多个类中继承时   使用继承,它们必须来自第一个继承的类。

只需将访问器设置为虚拟,它们将从vtable调用,因此您将为每个不同的子类型获得正确的功能。

答案 1 :(得分:1)

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);
    }
}