qml属性绑定中的Javascript异常



我似乎不明白异常是如何与属性绑定交互的:

TextField {
id:root
text: rebind()
function rebind(){
root.text = Qt.binding(function(){
try{
return accessor.getValue()
}
catch(e){
root.text = "Incorrect property: " + usedParam;
throw e;
}
})
}

我在getValue函数中抛出一个异常,这在qt creator中正确显示…直到我插入这个try catch块。然后我在TexField的输入字段中得到诊断文本,但在赋值后我重新抛出的异常消失在稀薄的空气中…在qtcreator中没有更多的指示。这是怎么回事?

UPD: stephen Quan的回答提出了大量关于代码的有效观点,我很感激(并将在本地重写代码),但没有回答问题,throw e在qt内部丢失的异常在哪里…这才是重点。

错误太多了:

  1. text: rebind()呼叫rebind()为函数
  2. 您正在尝试使用属性绑定分配root.text = Qt.binding()...
  3. 正在评估的值似乎没有任何属性绑定行为return accessor.getValue()
  4. 错误情况root.text = "Incorrect property: " + usedParam;以不同的方式分配错误

另外,我不建议将任何属性命名为root。要解决其中一些问题,请查看以下更改:

TextField {
id: textField
text: getValue()
}
Text {
id: errorText
}
function getValue() {
try {
errorText.text = "";
return accessor.getValue();
} catch (err) {
errorText.text = err.message;
throw err;
}
}

底部试图通过以下更改来清理示例:

  1. 实现getValue()作为一个true函数,它只返回一个值和一些异常处理
  2. 分配给textField.text

上面的问题是accessor.getValue()如何具有任何属性绑定行为,因为似乎没有可更改的输入。

你似乎也想看看上面的命令式版本,所以,为了完整,我也给你看那个模式:

TextField {
id: textField
}
Text {
id: errorText
}
function getValue() {
try {
errorText.text = "";
return accessor.getValue();
} catch (err) {
errorText.text = err.message;
throw err;
}
}
Component.onCompleted: {
textField.text = Qt.binding(getValue);
}

这里,你看到我替换了:

TextField {
id: textField
text: getValue()
}

TextField {
id: textField
}
Component.onCompleted: {
textField.text = Qt.binding(getValue);
}

Component.onCompleted并不完全是你所看到的。我只是选择一个任意的事件处理程序来放置代码。你可以选择一个不同的事件处理程序,例如Button onClicked或其他延迟事件来放置代码。这样做的原因是稍后执行代码。但是,Qt.binding语法有点难以掌握,如果您可以使用适当的声明性语法来避免它,那将是首选。

在下面的示例中,我用异常处理程序包装eval(),并实现调用它的声明性和命令式示例:

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Page {
ColumnLayout {
width: parent.width
Label { text: qsTr("Input") }
TextField {
id: input
Layout.fillWidth: true
text: "3 + 4"
}
Label { text: qsTr("Declarative Example") }
TextField {
Layout.fillWidth: text
text: evaluate(input.text)
}
Label { text: qsTr("Imperative Example") }
TextField {
id: result2
Layout.fillWidth: text
Component.onCompleted: {
result2.text = Qt.binding(() => evaluate(input.text))
}
}
}
function evaluate(stmt) {
try {
return eval(stmt);
} catch (err) {
return err.message;
}
}
}

你可以在网上试试!

相关内容

  • 没有找到相关文章

最新更新