QML和C++中的Null和Undefined

der*_*erM 8 javascript c++ qml qt5

在使用C++编写的自定义类型扩展QML时,我开始怀疑JS和C++之间的差异.

这次我想知道,如果nullC++方面的检查是否足够,或者是否有类似QUndefined"我"可能需要考虑的事情.至于我可以看到,这是不是说明这里.

或者换句话说:

  • 当我undefined在QML端设置属性时,在C++端会发生什么
  • 当我null在QML端设置属性时,在C++端会发生什么
  • 当我null在C++端设置属性时,QML端会发生什么

Rob*_*ell 13

你的答案肯定在正确的轨道上,但这里有更多的信息.

写入属性时会发生什么取决于该属性什么,例如,它是否是QObject属性?根据属性的类型,您可能还会在赋值时遇到错误(例如,如果您正在写入null像double这样的数字类型属性).

让我们假设,为了答案你要在a上设置属性QObject.undefined如果属性具有RESET为Q_PROPERTY定义的函数,则可以将其设置为.引用文档:

RESET功能是可选的.它用于将属性设置回其特定于上下文的默认值.例如,QWidget :: cursor有典型的READ和WRITE函数,QWidget :: cursor()和QWidget :: setCursor(),它还有一个RESET函数,QWidget :: unsetCursor(),因为没有调用QWidget :: setCursor()可以表示重置为特定于上下文的游标.RESET函数必须返回void并且不带参数.

更具体地说,如果你有一个具有RESET函数的Q_PROPERTY ,当你写入undefined该属性时,将调用RESET函数.

要将属性设置为null,答案位于最后一个引用的正上方,基本上,如果属性包含QObject*-derived类型,它将存储一个nullptr.

你问的最后一个案例是分配null给C++方面的属性.出于意图和目的,我假设你在问这样一个案例:

Q_PROPERTY(QObjectDerived* myThing READ myThing NOTIFY myThingChanged);

...

QObjectDerived *myThing() { return m_myThing; }

...

void somethingElse() {
    m_myThing = 0; // or NULL, nullptr, whatever floats your boat
    emit myThingChanged();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,此属性(myInstanceId.myThing)的QML 端null将从内存中结束.