【问题标题】:pyqt5 qml minimal example crashes on exitpyqt5 qml 最小示例在退出时崩溃
【发布时间】:2018-02-01 13:23:51
【问题描述】:

我有一个导致崩溃的小示例应用程序。

main.py

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine


def run():
    app = QGuiApplication(sys.argv)

    engine = QQmlApplicationEngine()
    engine.load(QUrl('main.qml'))

    if not engine.rootObjects():
        return -1

    return app.exec_()


if __name__ == '__main__':
sys.exit(run())

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtQuick.Dialogs 1.2

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

    FileDialog {
        id: fileDialog
        selectFolder: true

        onAccepted: {
            console.log('activated')
        }
    }

    Button {
        anchors.centerIn: parent
        text: "Open"
        onClicked: {
            fileDialog.open()
        }
    }
}

要导致崩溃,只需打开应用程序,单击按钮,选择目录,接受,然后关闭应用程序。

控制台显示警告消息:
QObject::startTimer: Timers can only be used with threads started with QThread
然后应用程序就崩溃了。任何线索为什么或如何获得错误消息/堆栈跟踪?

环境:Windows 10、python 3.6.1、PyQt5 5.9

【问题讨论】:

  • 我遇到了这个问题,我知道避免崩溃的唯一方法是动态创建FileDialog like this。任何想法也将不胜感激。
  • 是的,这也没有帮助,但这似乎已经“解决”了问题:stackoverflow.com/a/21614295/808727

标签: python qt qml pyqt5


【解决方案1】:

在调用 app.exec() 之前,您可以添加这一行:

app.aboutToQuit.connect(lambda: app.closeAllWindows())

Chris link 帮助解决了这个问题。退出时不再有应用程序崩溃。

【讨论】:

    【解决方案2】:

    我发现修复很简单,只需将parent 参数传递给QQmlApplicationEngine()

    engine = QQmlApplicationEngine(parent=app)
    

    【讨论】:

    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多