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

    ...
};

プロパティ値にアクセスすると、クラス B のメソッドではなく、クラス A のメソッドが直接呼び出されます。

これまでのところ、この明らかな制限を回避するために、プロパティ コードを複製し、各クラスからのシグナルを接続しました。

これが最善の解決策ですか?

(同じ名前のプロパティが原因で) 潜在的な問題が発生することはありますか?

4

2 に答える 2

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 に答える