考虑这些课程:
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类。
到目前为止,为了解决这个明显的限制,我复制了属性代码并连接了每个类的信号。
这是最好的解决方案吗?
是否有人发现潜在问题(由于属性具有相同名称)?
答案 0 :(得分:5)
来自Qt文档:
可以继承READ,WRITE和RESET函数。他们也可以 是虚拟的。当它们在多个类中继承时 使用继承,它们必须来自第一个继承的类。
只需将访问器设置为虚拟,它们将从vtable调用,因此您将为每个不同的子类型获得正确的功能。
答案 1 :(得分: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);
}
}