Как динамически обновлять дочерний список из родительского списка

У меня есть приложение QML, в котором есть два поля со списком: одно поле со списком родительского (страны), другое поле со списком дочернего (города). При выборе страны в дочернем поле со списком должны быть одновременно указаны города страны.

У меня есть код, в котором первое поле со списком выбирает страну, но не устанавливает модель списка поля со списком города. Он устанавливается после повторного открытия приложения.

import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    property alias comboBox: comboBox2
    Settings{
        property alias country : comboBox2.currentIndex
    }
    Dialog {
        id: dialog
        title: "Select Country"
        implicitWidth: parent.width
        implicitHeight: parent.height/2
        Column{
        ComboBox {
            id: comboBox2
            x: 199
            y: 176
            width: 277
            height: 48
            currentIndex: 0
            flat: false
            model: ["USA","Russia","Iran"]
        }
        }
    }
    ColumnLayout{
        anchors.horizontalCenter: parent.horizontalCenter
        spacing:20
        width: parent.width
    Button{
        anchors.horizontalCenter: parent.horizontalCenter
        id:select_country
        text:"select country"
        onClicked: dialog.open()
    }
    RowLayout{
        anchors.horizontalCenter: parent.horizontalCenter
        spacing:5
        width: parent.width
      Text {
         text:"Select City: "
       }
    ComboBox {
        id: comboBox1
        x: 199
        y: 176
        width: 277
        height: 48
        model: ListModel {
            id: model1
            dynamicRoles: true
            Component.onCompleted: {
                coord_combo()
                    }
            function coord_combo(){
                var i = comboBox1.currentIndex
                if (comboBox2.currentIndex===0){
                    comboBox1.model = ["New York","Washington","Houston"]
                    return comboBox1
                }
                else if (comboBox2.currentIndex === 1){
                    comboBox1.model = ["Moscow","Saint Petersburg","Novosibirsk"]

                    return comboBox1
                }
                else if (comboBox2.currentIndex === 2){
                    comboBox1.model = ["Tehran","Tabriz","Shiraz"]
                    return comboBox1
                }
            }
        }
    }
    }
    }
}

Я использовал функции javascript для изменения темы Material QML с помощью поля со списком. Но та же логика не работает для обновления модели списка другого поля со списком. Есть ли способ динамически обновлять дочерний список с помощью qml и javascript?


person ercishli    schedule 22.12.2018    source источник


Ответы (1)


Вы должны использовать сигнал onCurrentIndexChanged в родительском ComboBox и обновлять дочерний элемент всякий раз, когда он срабатывает. Что-то вроде этого;

onCurrentIndexChanged:
{
    if(currentIndex === 0)
        comboBox1.model = ["New York", "Washington", "Houston"]
    ...
}

Вы можете пойти дальше и написать функцию для получения городов текущей страны. Затем вы можете обновлять модель дочернего ComboBox всякий раз, когда изменяется currentIndex родительского ComboBox.

person xeco    schedule 22.12.2018