【问题标题】:Segmentation Fault changing Loader's sourceSegmentation Fault 改变 Loader 的来源
【发布时间】:2018-03-07 23:27:30
【问题描述】:

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

  1. 设置加载器的源loader.source = "Page1.qml"
  2. 再次更改加载器源loader.setSource("Page2.qml", listModel.get(0))
  3. 最后像第一步一样再次更改源: loader.source = "Page1.qml"
  4. Segfault 会出现。

代码如下:

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 的行会使段错误消失,但显然这不是解决方案:

onClicked: mainLoader.setSource("Page2.qml", {code: "1", name: "Abdelilah", lastname: "El Aissaoui" })

这是一个错误还是我做错了什么?

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

【问题讨论】:

    标签: qt segmentation-fault qml


    【解决方案1】:

    好吧,想想你在做什么:

    • 您只使用了一个加载程序
    • 您将包含数据模型的组件加载到其中
    • 该组件将另一个组件加载到引用该模型的加载器中
    • 拥有该模型的对象被销毁并替换为引用现已销毁的模型的对象

    你当然会撞车。你真的从 QML 下拉了地毯。

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

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

    【讨论】:

    • 我是这么想的,但是当你更改 Loader 源而不是第二页加载时出现崩溃真的很奇怪
    • @AbdelilahElAissaoui 何时它发生取决于 QML 内部,为什么它已经被解释了。你传递了一个模型项,它是一个 JS 对象,实际上在模型被那个额外的引用破坏后它仍然保持活动状态。但是,当您设置另一个源时,它必须“取消设置”以前的源,它会遇到现在悬空的对 lmIcs 的引用。
    • 嗯好吧。我已经尝试过 StackView 并且效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多