QML:在事件循环中销毁导致访问冲突的弹出窗口

时间:2017-03-27 13:42:24

标签: qt qml qtquick2 qtquickcontrols2

正当我调试试图销毁由Qt.createComponent(...)动态创建的弹出窗口的程序时,它偶尔会发生异常。

enter image description here

以下是相关代码:

ApplicationWindow {
    id: window
    property var dialog
    ...
    Component.onCompleted: {
        var dialogComponent = Qt.createComponent("qrc:/TestPopup.qml")
        dialog = dialogComponent.createObject(...)
        dialog.closed.connect(function(){ [] })
        dialog.open()
    }

    Timer {
    id: timer
    interval: 3000
    triggeredOnStart: false
    running: false
    onTriggered: dialog.destroy()
}

TestPopup.qml:

Popup {
    id: popup
    modal: true
    ...
    Button {
        text: "close"
        anchors.centerIn: parent
        onClicked: popup.close()
    }
}

[1]dialog.destroy()时,极有可能发生异常。 当[1]timer.start()时,它会偶尔发生异常。

如何安全地破坏弹出窗口?

1 个答案:

答案 0 :(得分:0)

堆栈跟踪看起来类似于QTBUG-59532。您可以尝试应用该问题的修补程序,即https://codereview.qt-project.org/#/c/189581/(如果您使用的是SwipeDelegate,也可以https://codereview.qt-project.org/#/c/189553/)。我没有在那条痕迹中看到SwipeDelegate,但尝试它不会有什么坏处。

您可以尝试的另一件事是在Linux上使用valgrind运行您的应用程序,如here所述。