[SOLVED] Are QML var properties passed by reference or by copy?


I have two QML files as below:

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

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


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)

Answered By – JarMan

Answer Checked By – Cary Denson (BugsFixing Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *