我正在学习QtQuick,而且我正在玩C ++类和QML属性之间的数据绑定。
在我的C ++对象模型中,我有两个属性:
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
Q_PROPERTY(bool status READ getStatus WRITE setStatus NOTIFY statusChanged)
在我的.qml文件中:
TextEdit {
placeholderText: "Enter your name"
text: user.name
}
Checkbox {
checked: user.status
}
当我用C ++代码中的setName
更改用户名时,它会自动反映在视图中。
当我选中/取消选中该复选框,或者当我从C ++代码中调用setStatus()
时,没有任何反应。似乎复选框的属性checked
与TextEdit
组件的行为不同。
我不想以声明方式绑定我的属性。 Qt Quick不支持属性绑定吗?
感谢您的帮助。
答案 0 :(得分:8)
正如leemes指出的那样,用户点击复选框会破坏您创建的绑定。因此,不要创建绑定,而是直接连接到更改信号以处理" get"案件。使用" onClicked"处理"设置"案件。此解决方案还需要您在Component.onCompleted()中初始化。例如......
CheckBox {
id: myCheck
onClicked: user.status = checked
Component.onCompleted: checked = user.status
Connections {
target: user
onStatusChanged: myCheck.checked = user.status
}
}
答案 1 :(得分:3)
解决这个问题的方法是在onClicked
中恢复绑定(用户点击复选框删除),类似于:
CheckBox {
checked: user.status
onClicked: {
user.status = checked;
checked = Qt.binding(function () { // restore the binding
return user.status;
});
}
}
如果您在调用Component.onCompleted
时无法访问模型,则可以避免出现问题。
答案 2 :(得分:1)
我发现使复选框仅在单击时发出信号,而不更改其状态更为自然:
// MyCheckBox.qml
CheckBox {
id: control
property bool changeOnClick: true // or just emit clicked()
MouseArea {
anchors.fill: parent
enabled: !control.changeOnClick
onClicked: control.clicked();
}
}
然后您可以将其绑定一次,并在单击时请求更改源:
MyCheckBox {
changeOnClick: false
checked: user.state
onClicked: {
user.state = !user.state;
}
}