QML和C ++中的空和未定义

时间:2017-01-11 08:39:38

标签: javascript c++ qml qt5

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

这一次,我想知道,如果null - 对C ++方面的检查是否足够,或者是否有类似“QUndefined”的东西我也可能需要考虑。据我所见,这里没有描述here

或换句话说:

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

1 个答案:

答案 0 :(得分:10)

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

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

我们假设,为了您在QObject上设置属性的答案。如果属性具有为Q_PROPERTY定义的undefined函数,则可以将其设置为RESETQuoting the documentation

  

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

更具体地说,如果您的Q_PROPERTY具有RESET功能,则当您向该属性the RESET function will be calledundefined时。

要将属性设置为null,答案就位于最后一个引用的正上方,基本上,如果属性包含QObject*派生类型it will store a 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();
}

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