Home > Net >  Are QML var properties passed by reference or by copy?
Are QML var properties passed by reference or by copy?

Time:03-17

I have two QML files as below:

//Page.qml
SelectionPage {
    model: localizationPageProxy.vehicleTypes //QObject* class exposed by property
    currentKey: localizationPageProxy.vehicleTypes.currentDataKey //QVariant property
}


//SelectionPage.qml
Item {
    property var model
    property var currentKey

    id: page

    ColumnLayout {
        height: parent.height
        width: parent.width * 0.9
        anchors.horizontalCenter: parent.horizontalCenter

        ListView {
            id: listView
            anchors.fill: parent
            ScrollBar.vertical: ScrollBar {}
            clip: true
            model: page.model.data
            spacing: Number.EPSILON // I don't know why the data loading is faster with that
            delegate: Item {
                height: listView.height * 0.12
                width: listView.width

                RadioButtonItem {
                    height: parent.height * 0.85
                    width: parent.width
                    anchors.centerIn: parent
                    text: modelData.value
                    checked: modelData.key === page.currentKey
                    onClicked: page.currentKey = modelData.key //here the c   property is changed
                }
            }
        }
    }
}

So, is currentKey property of SelectionPage.qml passed by reference?
If that was a copy I should not see the c model change.
Thank you for your help

CodePudding user response:

Rather than discussing copy vs reference, we should really be talking about bindings. When you do this:

currentKey: localizationPageProxy.vehicleTypes.currentDataKey

You're creating a binding. Whenever currentDataKey's value changes, currentKey will be updated too. But it is not a two-way binding. So changing currentKey does not update currentDataKey. Two-way bindings are pretty difficult to achieve, but there are posts on SO about them.

To actually solve what you're trying to achieve, I recommend adding a Q_INVOKABLE function to your QObject called updateCurrentKey or something. Then in your onClicked handler, do something like this:

onClicked: page.model.updateCurrentKey(modelData.key)
  • Related