如何从父组合框动态更新子组合框

时间:2018-12-22 13:46:13

标签: qt qml qtquickcontrols

我有一个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动态更新子组合框吗?

1 个答案:

答案 0 :(得分:0)

您应该在父ComboBox中使用onCurrentIndexChanged信号,并在触发子项时对其进行更新。像这样的东西

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

您可以走得更远,编写一个函数来获取当前国家/地区的城市。然后,只要父ComboBox的currentIndex发生更改,您就可以更新子ComboBox的模型。