当用 C++ 编写的自定义类型扩展 QML 时,我开始怀疑 JS 和 C++ 之间的区别。
这一次我想知道,如果 C++ 端的 null
检查就足够了,或者是否有我可能需要的类似“QUndefined
”的东西也考虑一下。据我所见,这不是描述here .
换句话说:
- 当我在 QML 端将属性设置为
undefined
时,C++ 端会发生什么 - 当我在 QML 端将属性设置为
null
时,C++ 端会发生什么 - 当我在 C++ 端将属性设置为
null
时 QML 端会发生什么
最佳答案
您的答案肯定是正确的,但这里有一些更多信息。
写入属性时会发生什么取决于该属性是什么,例如,它是 QObject 属性吗?等等。根据属性的类型,您也可能在赋值时遇到错误(例如,如果您将 null
写入数字类型属性,如 double)。
为了得到答案,我们假设您在 QObject
上设置一个属性。如果该属性具有为 Q_PROPERTY 定义的 RESET
函数,您可以将其设置为 undefined
。 Quoting the documentation :
A RESET function is optional. It is for setting the property back to its context specific default value. e.g., QWidget::cursor has the typical READ and WRITE functions, QWidget::cursor() and QWidget::setCursor(), and it also has a RESET function, QWidget::unsetCursor(), since no call to QWidget::setCursor() can mean reset to the context specific cursor. The RESET function must return void and take no parameters.
更具体地说,如果您有一个具有RESET
功能的Q_PROPERTY,当您向该属性写入undefined
时,the RESET
function will be called .
对于将属性设置为 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();
}
在这种情况下,此属性 (myInstanceId.myThing
) 的 QML 端将从内存中以 null
结束。
关于javascript - QML 和 C++ 中的 Null 和 Undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41586133/