Qt 无法将QML对象保存在加载程序QML文件中

Qt 无法将QML对象保存在加载程序QML文件中,qt,qml,Qt,Qml,我尝试使用设置从根QML文件上的另一个QML对象保存变量。我可以使用myloader.item.number访问变量,但当我在设置上尝试时,会出现错误:别名目标位置无效:number是否有办法使用设置模块保存变量 MyPage.qml import QtQuick 2.0 import QtQuick.Controls 2.12 Rectangle { property alias number: combo.currentIndex color: "red"

我尝试使用设置从根QML文件上的另一个QML对象保存变量。我可以使用
myloader.item.number
访问变量,但当我在设置上尝试时,会出现错误:
别名目标位置无效: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
    }
}
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
    }
}

由于无法使用别名,因此必须手动将其连接到设置。当我这样做时,它起作用了:

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
    }
}

@贾曼的答案是更好的解决方案。我找到了另一个解决方案,我还将设置对象用于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:", 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
    }
}
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的设置保存ComboBox的UI索引,main.qml的设置保存ComboBox的值。

这可能不起作用,因为加载程序的项最初为空。在源代码加载后,它将变为非null,但为时已晚。别名始终需要引用对象。看文件,我很害怕听到这个。我的应用程序有一个设置对话框。它有许多控件,因此它使应用程序运行缓慢。我想使用Loader来优化应用程序。如果不可能,我将不得不使用本地存储。您可以避免使用别名,例如:
属性int myNumber:myloader.item.number
当我使用int时,它不会被保存。当前索引始终为0。啊,我以前从未使用过
Settings
对象。我只是查了一下,现在我明白它是怎么工作的了。您只需要另一个属性来指向别名。例如,在
加载程序中添加一个int属性,然后将别名指向该属性。您可能还需要初始化组合框来读取该int。有机会我会试试的。