2

考虑这些类:

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

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

这是最好的解决方案吗?

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

4

2 回答 2

6

来自 Qt 文档:

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

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

于 2015-04-16T21:44:55.333 回答
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);
    }
}
于 2015-04-16T21:09:56.973 回答