我似乎不明白异常是如何与属性绑定交互的:
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内部丢失的异常在哪里…这才是重点。
错误太多了:
text: rebind()
呼叫rebind()
为函数- 您正在尝试使用属性绑定分配
root.text = Qt.binding()...
- 正在评估的值似乎没有任何属性绑定行为
return accessor.getValue()
- 错误情况
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;
}
}
底部试图通过以下更改来清理示例:
- 实现getValue()作为一个true函数,它只返回一个值和一些异常处理
- 分配给
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;
}
}
}
你可以在网上试试!