0

一番上のアイテムが「すべて選択/選択解除」アイテムであるListViewn個のアイテムを作成しようとしています。プログラムの起動時にCheckBoxすべての選択/選択解除をチェックすると、すべてのネスが選択/選択解除されますが、いずれかのネスをチェック/チェック解除してから、すべて選択/選択解除を押すことに戻るとすぐに、以前にチェック/チェック解除されていたもうトグルされません。期待どおりに動作しない理由がわかりません。以下に示すコードとデバッグ出力:CheckBoxCheckBoxCheckBoxCheckBox

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
4

1 に答える 1

2

QML プロパティは、静的割り当て (javascript 割り当て) またはバインディングを介して値を割り当てることができますが、静的割り当てはバインディングを消去するため、同時に値を割り当てることはできません

あなたの場合、プログラムの開始時に、すべてのCheckboxes がプロパティ バインディングを使用します。CheckBoxただし、静的割り当てをクリックすると、これらのバインディングが削除されます。checkedこれは、プロパティ(trueまたは)に静的な値が割り当てられたことを意味しますfalse。可能な回避策はQt.binding、JS でプロパティ バインディングを生成するために使用することです。つまり、元のバインディングを保持します。詳細については、こちらをご覧ください。

于 2015-08-13T12:43:37.810 に答える