考虑到这些类:
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文档:
读,写,和RESET功能可以继承。 它们也可以是虚拟的。 当他们在继承类在使用多重继承,他们必须来自第一继承类。
只是使存取虚拟的,他们会从虚表调用,所以你会得到正确的函数对每个不同的亚型。
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);
}
}