【发布时间】:2018-05-08 17:00:12
【问题描述】:
我是 QML 的初学者,我正在尝试遵循 QtQuick 的标准组件行为作为指导。
我想以 TextEdit 的工作方式实现用户输入组件。但是现在我真的很困惑text属性是如何实现的。
假设 1:
TextEdit 的text 是只写的,并且始终显示其text 属性分配/绑定到的内容(如果存在)。
实验一
操作
运行 QML
Window {
visible: true
property string foo: "foo"
TextEdit { text: foo }
}
在 TextEdit 中输入任何内容
预期文本始终显示“foo”且无法编辑。
实际文本随着您输入的内容而变化。
结论假设1是错误的。
假设 2:
text 属性设置为初始化时绑定的对象。
一旦用户对其进行编辑,text 就会被赋予一个新值,这会破坏绑定。
实验 2
操作
运行 QML
Window {
visible: true
property string foo: "foo"
TextEdit { id: t1; text: foo; x: 0; }
TextEdit { id: t2; text: t1.text; x: 100 }
}
在 t2 中输入内容,然后在 t1 中输入内容
预计 t2 编辑后,编辑t1 将不再改变t2 的显示。
实际 t2 可以单独编辑。但是一旦再次编辑 t1,t2 的显示就会再次绑定到 t1。
结论假设2不成立。
假设 3:
TextEdit 有类似internalText 的东西,代表用户输入的内容。并且 TextEdit 显示 internalText 或 text 以最新更改为准。
实验 3
操作
运行 QML
Window {
visible: true
property string foo: "foo"
TextEdit { id: t1; text: foo; x: 0; }
Button { x: 100; onClick: foo = "bar" } // A custom button
}
在 t1 中输入“blablabla”
点击按钮
在 t1 中输入“blablabla”
点击按钮,点击按钮,点击按钮一千次
预期 t1 可以编辑,点击按钮后显示重置为“栏”。
实际在第一次点击时显示设置为“栏”,之后点击按钮完全没有效果。
结论假设 3 是错误的......什么......??
还有……
在阅读了QML Reference several times 几次之后,尤其是Property Binding 部分,我不知道这样可以读写的属性如何(也不像Angular 的2 路绑定)。我很困惑。
在做了实验 3 之后,我真的很困惑,有人能解释一下它是如何工作的吗?
【问题讨论】: