【发布时间】:2014-05-25 21:45:01
【问题描述】:
我正在学习 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 不支持属性绑定吗?
感谢您的帮助。
【问题讨论】:
-
您在
checked和user.status之间设置绑定的方式,这意味着当user.status更改时,该复选框将被(取消)选中。如果用户点击复选框,绑定就会被移除。 -
反之,它应该工作:当你调用
setStatus时,它应该改变QML中的user.status属性并确实触发复选框只要你之前没有点击过。这仅在您在setStatus内发出statusChanged信号时才有效。 -
感谢您的评论。我确实想要您在第一条评论中描述的行为(如果值更改,复选框应该更改)但我也希望用户能够选中/取消选中它。如果我理解,触发复选框会破坏绑定。它是 QtQuick 行为,还是 Checkbox 特定的?如果我创建自己的复选框/开关组件,我可以禁用此行为吗?
-
我仔细检查了发出的信号,在
setStatus方法中进行了调试,但即使是“用户单击复选框”的情况也不起作用。明天我将使用另一个属性名称进行测试(也许“启用”用于 QML 中的内部内容),并将使用最少的代码重试。感谢您的帮助。 -
好吧,如果您希望在用户单击复选框时更改您的属性,您需要执行其他操作。您想要的本质上是一个 双向 绑定,它在 QtQuick 中不(直接)支持,换句话说,您需要一些 C++ 或 QML (JavaScript) 中的代码
标签: c++ qt data-binding checkbox qt-quick