在QML中,您可以使用typeof运算符来检查属性是否未定义。如果属性未定义,typeof运算符将返回"undefined"。例如: ``` if (typeof property === "undefined") { console.log("Property is undefined"); } else { console.log("Property is defined"); } ``` 请注意,这种方法只适用于检查属性是否未定义。如果属性已定义但其值为null,则typeof运算符也会返回"object"。因此,在使用typeof运算符时,请确保您的意图是检查属性是否未定义,而不是检查其值是否为null。

怎样在 QML 中检查属性是否未定义?
这是我所尝试的:
Button {
    id: myButton
    text: if (text === "undefined"){"default text"}
}
3个回答


那是一个非常聪明的解决方案。谢谢。只是为了向其他人解释一下;这有点像说(如果我错了,请纠正)如果(文本 === 文本){文本} else{"默认文本"} - Anon
2如果(文本){文本} else {"默认文本"}。如果(对象)在object未定义时评估为false。类似于C语言中的if(pointer),当指针的值为0(NULL)时评估为false。值得注意的是,用于按钮文本属性的text变量来自外部作用域。使用text: inText ? inText : "默认文本"或者if(inText) {文本} else {"默认文本"}会更清晰明了。 - Kissiel
抱歉我有点笨,但这是我从未完全理解的事情。从逻辑上讲,它应该是这样的 - 如果(文本为真)则 {文本 = 文本} 否则 {文本 = "默认文本"} -- 这个准确吗? - Anon
2你说得差不多对。这段伪代码唯一让人感到不直观的地方是 if (text is true)。我觉得更容易理解为 if (text *is*) 或者 if (text exists)。 另外一个好的参考来源是:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined - Kissiel
2这个函数在文本为空字符串的情况下会失败,if语句会返回false。 - RvdK

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: text ? text : "default text"
}

这个答案对我来说是一个警告。
QML Button: Binding loop detected for property "text"

将文本中的text更改为modelText会导致错误。
ReferenceError: modelText is not defined

这个对我来说停止了Javascript的执行;也就是说下一行代码不会被调用。
通过Javascript设置时,情况是相同的,但是比较冗长。
import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

    Component.onCompleted: {
        if (modelText !== "undefined") {
            myButton.text = modelText;
        }
    }
}

使用 typeof

typeof 运算符会静默处理错误并按预期工作。

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

    Component.onCompleted: {
        if (typeof modelText !== "undefined") {
            myButton.text = modelText;
        }
    }
}

要与未定义的值进行比较,您可以写成text === undefined。如果textnull,则此语句将计算为false。
如果您想检查值是否存在(即检查undefinednull),请将其用作if语句或三元运算符中的条件。如果您需要将比较结果存储为布尔值,请使用var textPresent = !!text(尽管双重!可能会让阅读代码的人感到困惑)。