首页 > 解决方案 > 不使用 QML 中的简单设置调用保存数组

问题描述

我正在做一个简单的项目,需要保存运行运行的数组的值。如果我尝试使用带有整数的设置,它会在运行之间保存得很好。如果以下代码运行两次,我得到 5、15、15、25,如预期的那样。

Window {
    visible: true
    width: 500
    height: 500
    id: root
    title: qsTr("Hello World")
    
    property int mNum: 5
    
    Rectangle {
        id: bob
        
        Component.onCompleted: {
            console.log(mNum)
            mNum+=10;
        }
        
        Component.onDestruction: {
            console.log(mNum)
        }
    }
    
    Settings {
        category: "justSomeSettings1"
        property alias mNumber: root.mNum
    }
}

但是,如果我尝试对数组做同样的事情,我会得到意想不到的结果。对于以下代码,如果我运行 2 次,我会打印 [peach,cherry,orange]、[peach,cherry,orange,apple]、[peach,cherry,orange] 和 [peach,cherry,orange,apple]。我想知道为什么我没有得到 [peach,cherry,orange], [peach,cherry,orange,apple], [peach,cherry,orange,apple] 和 [peach,cherry,orange,apple,apple]。

Window {
    visible: true
    width: 500
    height: 500
    id: root
    title: qsTr("Hello World")
    
    property var mArr: ["peach", "cherry", "orange"]
    
    Rectangle {
        id: joe
        
        Component.onCompleted: {
            console.log(mArr);
            mArr.push("apple");
        }
        
        Component.onDestruction: {
            console.log(mArr);
        }
    }
    
    Settings {
        category: "justSomeSettings2"
        property alias mArray: root.mArr
    }
}

有谁知道为什么会发生这种情况或是否有任何解决方法?

标签: qtqml

解决方案


var属性在更新时不会发出信号。因此,您的 Settings 对象永远不会发现值已更改。不过,您可以手动发出信号。所以你可以这样做:

mArr.push("apple");
mArrChanged();

推荐阅读