首页 文章

更改QML ListView的模型不会更改相应的委托

提问于
浏览
4

下面我创建一个带有委托的ListView,该委托包含一个CheckBox,其 checked 属性绑定到模型的 checked 角色 . 单击委托时,我想通过更改模型的 checked 属性来切换CheckBox状态 . 但 checkBox.checkedmodel.checked 之间的绑定仅在用户第一次单击该委托时起作用 . 之后,始终检查 checkBox ,与 model.checked 值无关 . 结果是用户无法取消选中该复选框,我不希望这样 .

import QtQuick 2.2
import QtQuick.Controls 1.1

ListView { id: listView
    height: 100
    width: 100

    model: ListModel {
        ListElement { checked: false }
        ListElement { checked: false }
    }

    delegate: Rectangle {
        width: listView.width
        implicitHeight: checkBox.implicitHeight * 1.3

        CheckBox { id: checkBox
            anchors.fill: parent
            text: index + 1
            checked: model.checked
        }

        MouseArea { id: mouseArea
            anchors.fill: parent
            onClicked: {
                var item = listView.model.get(index);

                console.log('old model.checked:', model.checked);
                item.checked = !item.checked;
                console.log('new model.checked:', model.checked);

                console.log('checkBox.checked:', checkBox.checked);
                console.log('something went wrong:', model.checked !== checkBox.checked);
            }
        }
    }
}

我的代码中的问题在哪里?如何使委托像普通的CheckBox一样工作?

1 回答

  • 6

    这是一个报告的错误:https://bugreports.qt.io/browse/QTBUG-31627 .

    使用该错误报告下的注释中描述的walkaround使我的代码中的复选框正常工作 . 我删除了 checked: model.checked 行并将以下代码添加到Rectangle委托:

    Binding {
        target: checkBox
        property: 'checked'
        value: model.checked
    }
    

相关问题