QML ListView 模型 setProperty 只工作 1 次

QML ListView Model setProperty Work only 1 time

我有一个充满复选框的 ListView,我想通过单击按钮更改复选框状态这是我的代码。

import QtQuick
import QtQuick.Controls 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    ListView {
        id: mylist
        width: parent.width
        height: 300
        anchors {
            top: parent.top
            left: parent.left
            right: parent.right
            bottom: change_state.top
            bottomMargin: 20
        }

        model: ListModel {
            id: mymodel
            ListElement {
                mystatus : false
            }
            ListElement {
                mystatus : false
            }
            ListElement {
                mystatus : false
            }
        }

        delegate: Rectangle {
            height: 50
            width: parent.width
            CheckBox {
                id: cb
                checked: mystatus
                anchors.fill: parent
                text: "State"
            }
        }
    }

    Button {
        id: change_state
        anchors {
            bottom: parent.bottom
        }
        text: "Change status"

        onClicked: {
            mymodel.setProperty(1, "mystatus", true)
            console.log("PRESSED")
        }
    }
}

问题是当我在 运行 应用程序后按下按钮时,它会更改状态并选中复选框,但如果我手动取消选中然后再次按下按钮,它有 0 个效果,永远无法再次检查。

QT 6.3 Windows 10 Android、IOS 和桌面版也有同样的问题。

使用 QT 5.15.2 测试过,同样的问题。

当您单击复选框本身时,您就打破了绑定。最初 checked 属性 绑定到 mystatus。但是,当您手动选中该框时,无论 mystatus.

的状态如何,您都会强制 checked 为真或假

您可以通过捕获 onClicked 信号并更新 mystatus 来保持绑定完整,而不是强制更改 checked 值。

CheckBox {
    id: cb
    checked: mystatus
    anchors.fill: parent
    text: "State"

    onClicked: {
        mystatus = !mystatus
    }
}

更新:

对于取消选中所有框的添加问题,您应该执行与上述相同的操作并更新模型中的 mystatus 值,而不是直接触摸 checked 属性 以便绑定不会坏。

for (var i = 0; i < mymodel.count; ++i) {
    mymodel.setProperty(i, "mystatus", false);
}