簡體   English   中英

如何覆蓋Q_Property?

[英]How to override a Q_Property?

考慮以下類:

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

到目前為止,要解決此明顯的限制,我已經復制了屬性代碼並連接了每個類的信號。

這是最好的解決方案嗎?

是否有人看到潛在的問題(由於屬性名稱相同)?

從Qt文檔中:

可以繼承READ,WRITE和RESET函數。 它們也可以是虛擬的。 在使用多重繼承的類中繼承它們時,它們必須來自第一個繼承的類。

只需將訪問器設為虛擬,即可從vtable中調用它們,因此您將為每種不同的子類型獲得正確的功能。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM