【问题标题】:Unable to save the QML object inside the Loader QML file无法在 Loader QML 文件中保存 QML 对象
【发布时间】: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 中读取。有机会我会试试看的。

标签: qt qml


【解决方案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 的值。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多