为什么QML Model-View-Delegate的行为如下?

时间:2015-08-13 11:29:20

标签: qt qml qt5 qtquick2 qtquickcontrols

我正在尝试制作ListViewCheckBox个项目,其中顶部项目是“选择/取消选择全部” - 项目。在程序启动时检查选择/取消选择所有CheckBox es时,它选择/取消选择所有n CheckBox es,但是一检查/取消选中任何n CheckBox es然后返回按下选择/取消全选,之前选中/未选中的CheckBox不再被切换。我不明白为什么它不能按预期工作。代码和调试输出如下:

GUI

查看:

import QtQuick 2.0
import QtQuick.Controls 1.2

Rectangle {
    id: view

    ScrollView {
        id: scrollView
        anchors.fill: parent

        ListView {
            id: listView
            anchors.fill: parent
            model: myModel
            delegate: Delegate { }
        }
    }

    Model {
        id: myModel

        Component.onCompleted: {
            add("C", "Orange", false)
            add("D", "Red", false)
        }
    }

    function add(name, color, check)
    {
        myModel.append({"name":name, "color":color, "check":check})
    }

    function edit(index, attribute, value)
    {
        myModel.setProperty(index, attribute, value)
    }

    function editMultiple(offset, length, attribute, value)
    {
        for (var i = offset; i < length; i++)
        {
            edit(i, attribute, value)
        }
    }
    function length()
    {
        return myModel.count
    }
}

代表:

import QtQuick 2.0
import QtQuick.Controls 1.2

Item {
    id: delegate
    height: 40
    width: 100

    property bool allCheckBoxChecked: false

    CheckBox {
        id: checkBox
        text: name
        anchors {
            fill: parent
            leftMargin: 20
            rightMargin: 20
        }
        checked: check
        onCheckedChanged: {
            if (index === 0)
            {
                allCheckBoxChecked = checkBox.checked
            }
            else
            {
                edit(index, "check", checkBox.checked)
            }
            console.log("Name: " + name + " Color: " + color + " Check: " + check)
        }
    }

    onAllCheckBoxCheckedChanged: {
        console.log("All: " + allCheckBoxChecked)
        if (allCheckBoxChecked)
        {
            editMultiple(0, length(), "check", true)
        }
        else
        {
            editMultiple(0, length(), "check", false)
        }
    }
}

型号:

import QtQuick 2.0

ListModel {
    id: listModel

    ListElement {
        name: "All"
        color: "Black"
        check: false
    }
    ListElement {
        name: "A"
        color: "Blue"
        check: false
    }
    ListElement {
        name: "B"
        color: "Green"
        check: false
    }
}

调试输出:

//Pressing "All".
qml: All: true
qml: Name: A Color: Blue Check: true
qml: Name: B Color: Green Check: true
qml: Name: C Color: Orange Check: true
qml: Name: D Color: Red Check: true
qml: Name: All Color: Black Check: true

//Pressing "All".
qml: All: false
qml: Name: A Color: Blue Check: false
qml: Name: B Color: Green Check: false
qml: Name: C Color: Orange Check: false
qml: Name: D Color: Red Check: false
qml: Name: All Color: Black Check: false

//Pressing "A".
qml: Name: A Color: Blue Check: true

//Pressing "All".
qml: All: true
//A does not get assigned anymore...
qml: Name: B Color: Green Check: true
qml: Name: C Color: Orange Check: true
qml: Name: D Color: Red Check: true
qml: Name: All Color: Black Check: true

//Pressing "All".
qml: All: false
//A does not get assigned anymore...
qml: Name: B Color: Green Check: false
qml: Name: C Color: Orange Check: false
qml: Name: D Color: Red Check: false
qml: Name: All Color: Black Check: false

1 个答案:

答案 0 :(得分:2)

由于静态分配擦除绑定,QML属性可以通过静态分配(javascript赋值)或通过绑定分配值,但

在您的情况下,当程序启动时,所有Checkbox es都使用属性绑定。但是当您单击CheckBox时,静态分配将删除这些绑定。这意味着现在为属性checkedtruefalse)分配了静态值。可能的解决方法是使用Qt.binding在JS中生成属性绑定,即保留原始绑定。您可以阅读有关here的更多信息。