C++ QT是否对QML属性使用动态_转换?
我在QT中遇到了奇怪的行为 假设您有一个基本控制器:C++ QT是否对QML属性使用动态_转换?,c++,qt,qml,C++,Qt,Qml,我在QT中遇到了奇怪的行为 假设您有一个基本控制器: class BaseController : public QObject { Q_OBJECT public: BaseController() = default protected: inline BaseNode * getRoot() const noexcept { return root; } protected: BaseNode * root; }; class ExtraContro
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();
};
和外部控制器:
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的指针,而BaseNode没有“name”属性。问题是:它是如何工作的?如何在qml中使用派生类的属性?qt是否执行动态强制转换?qt使用。这就是为什么需要MOC和Q_对象宏。
所以Qt“知道”每个对象在运行时具有哪些属性,并将这些知识用于QML
在C++方面,可以通过以下方式看到:
返回对象的name属性的值。
如果不存在此类属性,则返回的变量无效。
有关所有可用属性的信息通过和提供
请注意,对象的属性与其类型无关(请参见上面对动态属性的引用)。在访问对象的属性时,对象引用/指针的类型并不重要-始终会检索正确的元对象和属性列表
还有一种方法可以利用元对象系统来降级对象。我知道MOC系统。在Q_属性声明中甚至还有FINAL关键字,但在我的例子中,我根本没有属性。这与覆盖属性或向下投射对象无关。它的QML有一些我想理解的魔力……我的回答解释了Qt在运行时使用它自己的元对象系统来确定每个对象的可用属性。首先,使用
root
accessor获取对象。然后QML读取属性名称。此时,对象的类型无关紧要。您有一个对象,它有一组特定的属性。Qt将找到属性名称
,因为它就在那里。请注意,访问属性总是通过方法调用运行。可以将其视为一个方法getProperty(propertyName)
,它始终存在于您看不到的每个QObject中。这种方法总是有效的。这与在基指针上调用重写的方法相同(方法调用在运行时使用vtable进行调度)。我在答案中添加了这些详细信息。谢谢!现在它有意义了。