【发布时间】:2020-10-19 09:29:10
【问题描述】:
我在 QT 中遇到了奇怪的行为。
假设您有一个基本控制器:
class BaseController : public QObject
{
Q_OBJECT
public:
BaseController() = default
protected:
inline BaseNode * getRoot() const noexcept { return root; }
protected:
BaseNode * root;
};
还有额外控制器:
class ExtraController final : public BaseController
{
Q_OBJECT
Q_PROPERTY( BaseNode * root READ getRoot NOTIFY changed )
public:
ExtraController() { root = new ExtraNode(); }
signals:
void changed();
};
关键时刻,有两种类型的节点。 BaseNode 只是一个具有 "id" 属性的抽象类。 ExtraNode 是 BaseNode 的继承者,具有属性 "name"。
在 qml 我使用类似的东西:
Label {
text: extraController.root.name // property root - calls getRoot() in BaseController
}
还有它的作品!尽管 BaseController 的函数 getRoot() 返回指向 BaseNode 的指针,但它没有“name”属性。问题是:它是如何工作的?如何在 qml 中使用派生类的属性? qt 是否执行 dynamic_cast 左右?
【问题讨论】: