无法在 Loader QML 文件中保存 QML 对象
Posted
技术标签:
【中文标题】无法在 Loader QML 文件中保存 QML 对象【英文标题】:Unable to save the QML object inside the Loader QML file 【发布时间】:2020-07-13 16:37:24 【问题描述】:我尝试使用设置将另一个 QML 对象的变量保存在根 QML 文件中。我可以使用myloader.item.number
访问该变量,但是当我在“设置”上尝试它时出现错误:Invalid alias target location: number
有没有办法使用“设置”模块保存该变量?
MyPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.12
Rectangle
property alias number: combo.currentIndex
color: "red"
ComboBox
id: combo
model: ["a","b","c"]
main.qml
import QtQuick 2.3
import QtQuick.Window 2.10
import Qt.labs.settings 1.1
Window
visible: true
width: 200
height: 200
Component.onCompleted:
console.log("loader property is:", myloader.item.number)
//
Loader
id:myloader
//asynchronous: true
active: true
source: "MyPage.qml"
anchors.fill: parent
/*
// This can save the number with "property alias myNumber: mapage.number"
MyPage
id: mapage
*/
Settings
id: settings
// This gives error when using loader: Invalid alias target location: number
property alias myNumber: myloader.item.number
【问题讨论】:
这可能行不通,因为加载程序的项目最初为空。源加载后它变为非空,但为时已晚。别名总是需要一个对象来引用。请参阅文档here。 我害怕听到这个。我的应用程序有一个设置对话框。它有许多控件,因此会使应用程序变慢。我想使用 Loader 来优化应用程序。如果不可能,我将不得不使用本地存储。 你可以避免使用别名,像这样:property int myNumber: myloader.item.number
当我使用 int 时,它没有被保存。当前索引始终为 0。
啊,我以前从未使用过Settings
对象。我刚刚查了一下,现在我明白了它是如何工作的。您只需要一个不同的属性来指向别名。例如,在Loader
中,添加一个 int 属性,然后将别名指向该属性。您可能还需要初始化组合框以从该 int 中读取。有机会我会试试看的。
【参考方案1】:
由于您不能使用别名,您必须手动将其连接到“设置”。当我这样做时它起作用了:
import QtQuick 2.3
import QtQuick.Window 2.10
import Qt.labs.settings 1.1
Window
visible: true
width: 200
height: 200
Component.onCompleted:
console.log("loader property is:", myloader.item.number)
//
Loader
id:myloader
active: true
sourceComponent: myPage
anchors.fill: parent
Component
id: myPage
MyPage
// Initialize the combobox from Settings
number: settings.myNumber
// Update the settings from the combobox
onNumberChanged: settings.myNumber = number
Settings
id: settings
property int myNumber
【讨论】:
【参考方案2】:@JarMan 的回答是更好的解决方案。我找到了另一个解决方案,我也将 Settings 对象用于 MyPage.qml:
import QtQuick 2.0
import QtQuick.Controls 2.12
import Qt.labs.settings 1.1
Rectangle
property alias number: settings2.comboIndex
Settings
id: settings2
property alias comboIndex: combo.currentIndex
color: "red"
ComboBox
id: combo
model: ["a","b","c"]
main.qml
import QtQuick 2.3
import QtQuick.Window 2.10
import Qt.labs.settings 1.1
Window
visible: true
width: 200
height: 200
Component.onCompleted:
console.log("loader property is:", settings.myNumber)
Loader
id:myloader
source: "MyPage.qml"
anchors.fill: parent
Settings
id: settings
property int myNumber: myloader.item.number
MyPage 的Settings 保存ComboBox 的UI 索引,main.qml 的Settings 保存ComboBox 的值。
【讨论】:
以上是关于无法在 Loader QML 文件中保存 QML 对象的主要内容,如果未能解决你的问题,请参考以下文章