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

时间:2018-03-07 23:27:31

标签: qt segmentation-fault qml

我正面临一个非常奇怪的问题,即更改Loader的来源ListElementListModel)。 如何重现它:

  1. 设置加载器loader.source = "Page1.qml"
  2. 的来源
  3. 再次更改加载程序源loader.setSource("Page2.qml", listModel.get(0))
  4. 最后再次更改源代码,如第一步: loader.source = "Page1.qml"
  5. Segfault会出现。
  6. enter image description here

    以下是代码:

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

    Page1.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))
        }
    }
    

    Page2.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进行编译。

1 个答案:

答案 0 :(得分:1)

好吧,想想你在做什么:

  • 您只使用一个装载机
  • 将包含数据模型的组件加载到其中
  • 该组件将另一个组件加载到引用模型
  • 的加载器中
  • 具有模型的对象被销毁并被引用现在销毁模型的对象替换

当然你会崩溃。你真的从QML下拉地毯。

如果设置文字值,它不会崩溃,因为它没有引用模型。

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

相关问题