Не удается редактировать свойства объекта в файле JavaScript QML

Может кто-нибудь, пожалуйста, объясните мне, что я делаю неправильно со следующей настройкой.

Идея заключается в разработке игрового движка в engine.js, а логика пользовательского интерфейса - в файле qml.

page.qml

Page {
    id: page
    SilicaGridView {
        id: listView
        model: ListModel {
            id: roleList
            Component.onCompleted: {
                Engine.addRoles(roleList);
            }
        }

        delegate: Rectangle {
            id: delegate
            border.color: model.selected ? Theme.highlightColor : Theme.primaryColor

            Label {
                text: qsTr(model.name)
            }
            MouseArea {
                anchors.fill: parent;
                onClicked: {
                    Engine.selectRole(model);
                }
            }
        }
    }
}

engine.js:

function Role() {
    this.name = "role"
    this.selected = false;
}

function addRoles(list) {
    list.append(new Role());
    list.append(new Role());
}

function selectRole(role) {
    console.log(role.selected) // <-- false
    role.selected = true;
    console.log(role.selected) // <-- false
}

Поэтому, когда я щелкаю элемент на странице, он вызывает selectRole из движка. По какой-то странной причине обновление выбранного свойства в модели фактически не обновляет модель. Почему это так?

1 ответ

Представления в Qt Quick уже имеют метод отслеживания выбранного элемента:

Это означает, что вам не нужно иметь selected переменная в вашем Role объекты. Engine.js становится:

function Role() {
    this.name = "role"
}

function addRoles(list) {
    list.append(new Role());
    list.append(new Role());
}

Ваш код QML не работает (это действительно помогает, если вы предоставите рабочий пример), поэтому я позволил себе запустить его:

import QtQuick 2.3
import QtQuick.Controls 1.1

import "Engine.js" as Engine

ApplicationWindow {
    width: 500
    height: 500

    ListView {
        id: listView
        width: 100
        height: 100
        anchors.centerIn: parent

        model: ListModel {
            id: roleList
            Component.onCompleted: {
                Engine.addRoles(roleList);
            }
        }

        delegate: Rectangle {
            id: delegateItem
            border.color: ListView.isCurrentItem ? "red" : "black"
            width: listView.width
            height: 30

            Label {
                id: label
                text: qsTr(model.name)
                anchors.centerIn: parent
            }
            MouseArea {
                anchors.fill: parent;
                onClicked: {
                    listView.currentIndex = index;
                    print(index, delegateItem.ListView.isCurrentItem)
                }
            }
        }
    }
}

Обратите внимание на использование присоединенного свойства ListView isCurrentItem. Это удобное свойство, которое эквивалентно:

delegate: Rectangle {
    border.color: listView.currentIndex == index ? "red" : "black"
}
Другие вопросы по тегам