Qt 改变装载机来源的分段故障

Qt 改变装载机来源的分段故障,qt,segmentation-fault,qml,Qt,Segmentation Fault,Qml,我面临着一个非常奇怪的问题,用ListModel的ListElement更改加载程序的源。 如何复制它: 设置加载程序的源loader.source=Page1.qml 再次更改加载程序source loader.setSourcePage2.qml, listModel.get0 最后再次更改源,如第一步中所示: loader.source=Page1.qml 故障会出现。 代码如下: main.qml Window { visible: true width: 640

我面临着一个非常奇怪的问题,用ListModel的ListElement更改加载程序的源。 如何复制它:

设置加载程序的源loader.source=Page1.qml 再次更改加载程序source loader.setSourcePage2.qml, listModel.get0 最后再次更改源,如第一步中所示: loader.source=Page1.qml 故障会出现。 代码如下:

main.qml

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Button {
        id: button
        text: qsTr("Load page 1")
        onClicked: mainLoader.source="Page1.qml"
    }

    Loader {
        anchors.left: button.right
        id: mainLoader
        width: 149
        height: 101
    }
}
第1.qml页

Rectangle {
    color: "red"
    width: 149
    height: 101

    ListModel {
        id: lmIcs
        ListElement {
            code: "1"
            name: "Abdelilah"
            lastname: "El Aissaoui"
        }
    }

    Button {
        text: "Load page 2"
        onClicked: mainLoader.setSource("Page2.qml", lmIcs.get(0))
    }
}
第2.qml页

Rectangle {
    color: "lightgray"
    width: 149
    height: 101

    property int code;
    property string name;
    property string lastname;

    Text {
        text: code + " - " + name + " " + lastname
    }
}
我注意到,用硬编码值更改加载page2的行将使segfault消失,但显然这不是一个解决方案:

onClicked: mainLoader.setSource("Page2.qml", {code: "1", name: "Abdelilah", lastname: "El Aissaoui" })
这是一个错误还是我做错了什么


如果有帮助的话,我正在使用Linux mint 17.3,并使用CLang和GCC进行编译。

好吧,想想你在做什么:

您只使用一个加载程序 将包含数据模型的组件加载到其中 该组件将另一个组件加载到引用模型的加载程序中 具有该模型的对象将被销毁,并替换为引用现在已销毁的模型的对象 当然你会撞车的。你真的把地毯从QML下面拉出来了

如果您设置文本值,它不会崩溃,因为它不引用模型


您应该改用StackView。新打开的页面不会替换具有加载程序的项目,而只是将其推到上面,直到它被销毁,以您离开的状态返回上一页。

我想是这样的,但当您更改加载程序源而不是第二页时,会出现崩溃,这真的很奇怪loads@AbdelilahElAissaoui何时发生取决于QML内部,发生的原因已经解释过了。您传递了一个模型项,它是一个JS对象,在模型被那个额外的引用破坏后,它实际上保持活动状态。但是当您设置另一个源时,它必须取消设置前一个源,它会运行到现在悬空的对lmIcs.Hmmm的引用中。我试过StackView,效果非常好。谢谢