在使用C++编写的自定义类型扩展QML时,我开始怀疑JS和C++之间的差异.
这次我想知道,如果null
C++方面的检查是否足够,或者是否有类似QUndefined
"我"可能需要考虑的事情.至于我可以看到,这是不是说明这里.
或者换句话说:
当我undefined
在QML端设置属性时,在C++端会发生什么
当我null
在QML端设置属性时,在C++端会发生什么
当我null
在C++端设置属性时,QML端会发生什么
Robin Burche.. 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(); }
在这种情况下,此属性(myInstanceId.myThing
)的QML 端null
将从内存中结束.
你的答案肯定在正确的轨道上,但这里有更多的信息.
写入属性时会发生什么取决于该属性是什么,例如,它是否是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(); }
在这种情况下,此属性(myInstanceId.myThing
)的QML 端null
将从内存中结束.