Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT是否对QML属性使用动态_转换?_C++_Qt_Qml - Fatal编程技术网

C++ QT是否对QML属性使用动态_转换?

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

我在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();
};
和外部控制器:

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进行调度)。我在答案中添加了这些详细信息。谢谢!现在它有意义了。