Qt 5.7 QML为什么我的CheckBox属性绑定消失了?

时间:2016-08-05 22:15:42

标签: qt qml qtquickcontrols

我有一个简单的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
        }
    }
}

看起来像这样:

enter image description here

要重现此问题,请先点击&#34;设置全部&#34;并且&#34;清除所有&#34;。然后点击一些复选框。然后点击&#34;设置全部&#34;并且&#34;清除所有&#34;再次。您将看到您检查的方框不再受影响。

感谢。

2 个答案:

答案 0 :(得分:3)

OP在这里。

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