4

ユーザーから提供された入力に従って、QMLリストビューでアイテムのリストをソートしようとしています。ソートのロジックを書きましたが、ソートされたモデルを設定できません。ソートされたモデルは、元の ListView に使用された実際のモデルに割り当てられていないようです。コードを見て、何か間違っているかどうか教えてください。

//main.qml

import QtQuick 1.1
Rectangle {
     id: page
     width: 500; height: 400
     color: "#edecec"
     ModifiedForSorting {
         id: search; focus: true
     }
 }

//ModifiedForSorting.qml

import QtQuick 1.1

FocusScope {
    id: focusScope
    width: 250; height: 28
    Text {
        id: typeSomething
        anchors.fill: parent; anchors.leftMargin: 8
        verticalAlignment: Text.AlignVCenter
        text: "Type here..."
        color: "gray"
        font.italic: true
    }

    MouseArea {
        anchors.fill: parent
        onClicked: { focusScope.focus = true; textInput.openSoftwareInputPanel(); }
    }

    TextInput {
        id: textInput
        anchors { left: parent.left; leftMargin: 8;rightMargin: 8; verticalCenter: parent.verticalCenter }
        focus: true
        selectByMouse: true

        onTextChanged: {
            //update list as per input from user
            container.getSortedItems(textInput.text);
            color = "red"
        }
    }
    states: State {
        name: "hasText"; when: textInput.text != ''
        PropertyChanges { target: typeSomething; opacity: 0 }
    }

    transitions: [
        Transition {
            from: ""; to: "hasText"
            NumberAnimation { exclude: typeSomething; properties: "opacity" }
        },
        Transition {
            from: "hasText"; to: ""
            NumberAnimation { properties: "opacity" }
        }
    ]

    Rectangle {
        id: container
        width: 500; height: 400
        color: "#343434"
        anchors.top: textInput.bottom
        ListModel {
            id: namesModel

            ListElement {
                title: "Mumbai"
            }
            ListElement {
                title: "Pune"
            }
            ListElement {
                title: "Bangalore"
            }
            ListElement {
                title: "Kolkata"
            }
            ListElement {
                title: "Hyderabad"
            }
            ListElement {
                title: "Nagpur"
            }
            ListElement {
                title: "Thane"
            }
        }

        // The delegate for each item in the model:
        Component {
            id: listDelegate

            Item {
                id: delegateItem
                width: listView.width; height: 55
                clip: true

                Row {
                    anchors.verticalCenter: parent.verticalCenter
                    spacing: 10
                    Column {
                        anchors.verticalCenter: parent.verticalCenter

                        Text {
                            text: title
                            font.pixelSize: 15
                            color: "white"
                        }
                    }
                }
            }
        }

        function showAll() {
            var filteredItems = "";
            for (var i = 0; i < namesModel.count; i++) {

                filteredItems = filteredItems + namesModel.get(i).title;
            }
            listView.model = filteredItems;
            //namesModel = filteredItems;
        }

        function getSortedItems(searchTerm) {
            var filteredItems = "";
            if (searchTerm === "") {
                showAll();
                return;
            }

            for (var i = 0; i < namesModel.count; i++) {
                if (namesModel.get(i).title.indexOf(searchTerm) === 0) {
                    filteredItems = filteredItems + namesModel.get(i).title;
                }
            }
            listView.model = filteredItems;
            //namesModel = filteredItems;
        }

        // The ListView:
        ListView {
            id: listView
            anchors.fill: parent; anchors.margins: 20
            model: namesModel
            delegate: listDelegate
        }
    }
}

上記のように、並べ替えられたモデルは ListView に再割り当てされていないと思います。私はわかりません。私を助けてください。ありがとう。

4

1 に答える 1

3

あなたのコードを見ると、ソートではなくアイテムのフィルタリングを意味していると思います。

関数で、文字列filteredItemsをプロパティに割り当てようとしlistView.modelます。アプリケーション ログに明示的なエラーが記録されている可能性があります。

このエラーを解決するには、auxiliary を使用しListModelて、フィルターに適合するアイテムだけを入力します。listDelegateコンポーネントの下のすべてのコードをこれに置き換えてみてください。

    ListModel{ id: filteredModel }

    function getSortedItems(searchTerm) {

        // Clear the aux model
        filteredModel.clear();

        // Add fitting items to the aux model
        for (var i = 0; i < namesModel.count; i++) {
            if (searchTerm === "" || namesModel.get(i).title.indexOf(searchTerm) === 0) {
                filteredModel.append(namesModel.get(i));
            }
        }

    }

    // The ListView:
    ListView {
        id: listView
        anchors.fill: parent; anchors.margins: 20
        model: filteredModel
        delegate: listDelegate
    }
于 2012-11-21T14:43:59.000 に答える