我有一个简单的CheckBox
es列表,一周中的每一天都有一个。它们取决于days
的值,一个使用掩码的整数,每个CheckBox
为1位。
使用"清除全部"分配给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
}
}
}
看起来像这样:
要重现此问题,请先点击&#34;设置全部&#34;并且&#34;清除所有&#34;。然后点击一些复选框。然后点击&#34;设置全部&#34;并且&#34;清除所有&#34;再次。您将看到您检查的方框不再受影响。
感谢。
答案 0 :(得分:3)
Selbie的回答非常正确。但我想发布一个我更喜欢的变体。
我得出的结论是,CheckBox
在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
}
}
}
发布此变体以造福他人。
答案 1 :(得分:1)
当您手动单击该复选框时,xml
属性将重新分配给硬编码的checked
,而不是原始表达式:true
。同样,手动取消选中该框会强制(days & (1<<index)) != false
属性为硬编码checked
。
修复方法是使用Qt.binding简单地重新绑定false
属性。我已经清理了你的javascript并修复了你的错误。不客气。
checked