QML var 属性是通过引用还是通过复制传递的?
Are QML var properties passed by reference or by copy?
我有两个 QML 文件如下:
//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
}
}
}
}
}
那么, SelectionPage.qml 的 currentKey 属性 是通过引用传递的吗?
如果那是一个副本,我不应该看到 c++ 模型发生变化。
感谢您的帮助
与其讨论复制与引用,不如讨论绑定。当您这样做时:
currentKey: localizationPageProxy.vehicleTypes.currentDataKey
您正在创建绑定。每当 currentDataKey 的值发生变化时,currentKey 也会更新。但它不是 two-way 绑定。所以改变 currentKey 不会更新 currentDataKey。 Two-way 绑定很难实现,但是 SO 上有关于它们的帖子。
为了真正解决您想要实现的目标,我建议向您的 QObject 添加一个名为 updateCurrentKey
或其他名称的 Q_INVOKABLE 函数。然后在您的 onClicked 处理程序中,执行如下操作:
onClicked: page.model.updateCurrentKey(modelData.key)
我有两个 QML 文件如下:
//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
}
}
}
}
}
那么, SelectionPage.qml 的 currentKey 属性 是通过引用传递的吗?
如果那是一个副本,我不应该看到 c++ 模型发生变化。
感谢您的帮助
与其讨论复制与引用,不如讨论绑定。当您这样做时:
currentKey: localizationPageProxy.vehicleTypes.currentDataKey
您正在创建绑定。每当 currentDataKey 的值发生变化时,currentKey 也会更新。但它不是 two-way 绑定。所以改变 currentKey 不会更新 currentDataKey。 Two-way 绑定很难实现,但是 SO 上有关于它们的帖子。
为了真正解决您想要实现的目标,我建议向您的 QObject 添加一个名为 updateCurrentKey
或其他名称的 Q_INVOKABLE 函数。然后在您的 onClicked 处理程序中,执行如下操作:
onClicked: page.model.updateCurrentKey(modelData.key)