当使用C ++编写的自定义类型扩展QML时,我开始怀疑JS和C ++之间的差异。
这一次,我想知道,如果null
- 对C ++方面的检查是否足够,或者是否有类似“QUndefined
”的东西我也可能需要考虑。据我所见,这里没有描述here。
或换句话说:
undefined
时,C ++端会发生什么?null
时,C ++端会发生什么?null
时,QML方面会发生什么?答案 0 :(得分:10)
你的答案肯定在正确的轨道上,但这里有更多的信息。
写入属性时会发生什么取决于 属性是什么,例如,它是否是QObject属性?根据属性的类型,您可能还会在赋值时遇到错误(例如,如果您正在将null
写入数字类型属性,例如double)。
我们假设,为了您在QObject
上设置属性的答案。如果属性具有为Q_PROPERTY定义的undefined
函数,则可以将其设置为RESET
。 Quoting 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 called写undefined
时。
要将属性设置为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
结尾。