Qt 5.7 QML 为什么我的 CheckBox 属性 绑定消失了?
Qt 5.7 QML Why are my CheckBox property bindings disappearing?
我有一个简单的 CheckBox
列表,一个对应一周中的每一天。它们取决于 days
的值,一个使用掩码的整数,每个 CheckBox
.
1 位
使用 "clear all" 按钮或 "set all" 按钮分配给 days
都有效,并且它们会更新。但是,一旦单击了任何框,它们将不再响应相关 属性 days
.
中的更改
这是为什么?他们是否以某种方式变得不受约束。如果是这样,我应该手动重新绑定它们吗?如果是这样,为什么?
这是代码,
import QtQuick 2.7
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
ApplicationWindow
{
visible: true
width: 800
height: 400
property int days: 0
ColumnLayout
{
Repeater
{
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
CheckBox
{
text: modelData
checked: (days & (1<<index)) != false
onClicked:
{
if (checked) days |= (1<<index);
else days &= ~(1<<index);
}
}
}
Button
{
text: "clear all"
onClicked: days = 0
}
Button
{
text: "set all"
onClicked: days = 127
}
}
}
看起来像这样:
要重现该问题,请先单击 "set all" 和 "clear all"。然后点击一些复选框。然后再次单击 "set all" 和 "clear all"。您会看到您选中的框不再受到影响。
谢谢。
当您手动单击复选框时,checked
属性 会重新分配给硬编码 true
而不是原始表达式:(days & (1<<index)) != false
。同样,手动取消选中该框会将 checked
属性 强制为硬编码 false
.
修复方法是使用 Qt.binding 简单地重新绑定 checked
属性。我已经清理了您的 javascript 并修复了您的错误。不客气。
Repeater
{
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
CheckBox
{
function isChecked() {
return ((days & (1 << index)) != 0);
}
text: modelData
checked: isChecked()
onClicked:
{
if (checked) {
days |= (1<<index);
}
else {
days &= ~(1<<index);
}
// now rebind the item's checked property
checked = Qt.binding(isChecked);
}
}
}
OP在这里。
Selbie 的回答非常正确。但我想要 post 我喜欢的变体。
我得出的结论是 CheckBox
es 在 QT 中被破坏了。这是因为您需要将它们绑定到您的数据模型。 而且您还需要单击它们(否则有什么意义)。单击它们会断开与模型的连接,因此必须手动修复它(请参阅 Selbie 的回答)。对我来说这是一个破烂的设计。
我的变体使用了 Binding
,这样就不必在每次点击时都重新建立。
像这样:
import QtQuick 2.7
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
ApplicationWindow
{
visible: true
width: 800
height: 400
property int days: 0
ColumnLayout
{
Repeater
{
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
CheckBox
{
text: modelData
Binding on checked { value: (days & (1 << index)) != 0 }
onClicked:
{
if (checked) days |= (1<<index)
else days &= ~(1<<index)
}
}
}
Button
{
text: "clear all"
onClicked: days = 0
}
Button
{
text: "set all"
onClicked: days = 127
}
}
}
为了他人的利益而发布此变体。
我有一个简单的 CheckBox
列表,一个对应一周中的每一天。它们取决于 days
的值,一个使用掩码的整数,每个 CheckBox
.
使用 "clear all" 按钮或 "set all" 按钮分配给 days
都有效,并且它们会更新。但是,一旦单击了任何框,它们将不再响应相关 属性 days
.
这是为什么?他们是否以某种方式变得不受约束。如果是这样,我应该手动重新绑定它们吗?如果是这样,为什么?
这是代码,
import QtQuick 2.7
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
ApplicationWindow
{
visible: true
width: 800
height: 400
property int days: 0
ColumnLayout
{
Repeater
{
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
CheckBox
{
text: modelData
checked: (days & (1<<index)) != false
onClicked:
{
if (checked) days |= (1<<index);
else days &= ~(1<<index);
}
}
}
Button
{
text: "clear all"
onClicked: days = 0
}
Button
{
text: "set all"
onClicked: days = 127
}
}
}
看起来像这样:
要重现该问题,请先单击 "set all" 和 "clear all"。然后点击一些复选框。然后再次单击 "set all" 和 "clear all"。您会看到您选中的框不再受到影响。
谢谢。
当您手动单击复选框时,checked
属性 会重新分配给硬编码 true
而不是原始表达式:(days & (1<<index)) != false
。同样,手动取消选中该框会将 checked
属性 强制为硬编码 false
.
修复方法是使用 Qt.binding 简单地重新绑定 checked
属性。我已经清理了您的 javascript 并修复了您的错误。不客气。
Repeater
{
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
CheckBox
{
function isChecked() {
return ((days & (1 << index)) != 0);
}
text: modelData
checked: isChecked()
onClicked:
{
if (checked) {
days |= (1<<index);
}
else {
days &= ~(1<<index);
}
// now rebind the item's checked property
checked = Qt.binding(isChecked);
}
}
}
OP在这里。
Selbie 的回答非常正确。但我想要 post 我喜欢的变体。
我得出的结论是 CheckBox
es 在 QT 中被破坏了。这是因为您需要将它们绑定到您的数据模型。 而且您还需要单击它们(否则有什么意义)。单击它们会断开与模型的连接,因此必须手动修复它(请参阅 Selbie 的回答)。对我来说这是一个破烂的设计。
我的变体使用了 Binding
,这样就不必在每次点击时都重新建立。
像这样:
import QtQuick 2.7
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
ApplicationWindow
{
visible: true
width: 800
height: 400
property int days: 0
ColumnLayout
{
Repeater
{
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
CheckBox
{
text: modelData
Binding on checked { value: (days & (1 << index)) != 0 }
onClicked:
{
if (checked) days |= (1<<index)
else days &= ~(1<<index)
}
}
}
Button
{
text: "clear all"
onClicked: days = 0
}
Button
{
text: "set all"
onClicked: days = 127
}
}
}
为了他人的利益而发布此变体。