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 我喜欢的变体。

我得出的结论是 CheckBoxes 在 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
        }
    }
}

为了他人的利益而发布此变体。