[英]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.