当使用Qt.quit()而不是整个QGUI应用程序时,如何仅退出当前QQmlApplicationEngine?

当使用Qt.quit()而不是整个QGUI应用程序时,如何仅退出当前QQmlApplicationEngine?,qt,pyqt,qml,Qt,Pyqt,Qml,我编写这些代码是为了更好地理解我的问题: main.py 从PyQt5.QtGui导入qgui应用程序 从PyQt5.QtQml导入QQmlApplicationEngine app=qgui应用程序([]) engine1=QQmlApplicationEngine() engine1.load(“hello.qml”) engine2=QQmlApplicationEngine() engine2.load(“hello.qml”) app.exec() 你好,qml import QtQ

我编写这些代码是为了更好地理解我的问题:

main.py

从PyQt5.QtGui导入qgui应用程序
从PyQt5.QtQml导入QQmlApplicationEngine
app=qgui应用程序([])
engine1=QQmlApplicationEngine()
engine1.load(“hello.qml”)
engine2=QQmlApplicationEngine()
engine2.load(“hello.qml”)
app.exec()
你好,qml

import QtQuick.Window 2.14
import QtQuick.Controls 2.15

Window {
    visible: true

    Button {
        text: "Button"
        onPressed: Qt.quit()
    }

}
按下按钮后,两个窗口均关闭。这不是我所期望的。

解释 这是在中指出的默认行为:

默认QQmlEngine的配置更改列表:

  • 正在将Qt.quit()连接到QCoreApplication::quit()
  • 自动加载 与主QML相邻的i18n目录中的翻译文件 文件
    • 翻译文件必须有“qml_u”前缀,例如qml_ja_JP.qm
  • 当QJSEngine::uiLanguage/ Qt.uiLanguage属性已更改
  • 自动设置孵化时间 控制器(如果场景包含QQuickWindow)
  • 自动设置 QQmlFileSelector作为url拦截器,将文件选择器应用于 所有QML文件和资产
引擎行为可以进一步调整 通过使用从QQmlEngine继承的方法

(强调矿山)

因此,有两种选择:

  • 卸下连接:

    用于发动机输入(发动机1、发动机2):
    发动机。断开()
    
  • 使用QQmlEngine而不是QQmlApplicationEngine


适当的解决方案 转到后台问题,即当用户按下按钮时如何关闭窗口,以便您不应使用而应调用窗口的方法:

import QtQuick.Window 2.14
import QtQuick.Controls 2.15

Window {
    id: root
    visible: true

    Button {
        text: "Button"
        onPressed: root.close()
    }
}
导入QtQuick.Window 2.14 导入QtQuick.Controls 2.15 窗口{ id:根 可见:正确 钮扣{ 文本:“按钮” onPressed:root.close() } }
仅当您要退出整个应用程序时才应使用。

请解释为什么需要两个引擎?仅举一个例子。事实上,有时我想在一个.py文件中创建两个qml窗口,但当一个窗口使用Qt.quit()退出时,两个窗口同时退出。我想知道如何在同一个.py文件中创建qml窗口,而不让两个窗口相互影响。我猜qml引擎是一种单例。当然不是这样,您可以创建多个实例,但是查看文档,例如,没有得到一些引擎指针,那么新类型将注册到哪个引擎?事实上,这是胡说八道,你永远不会需要它。所有你想要的都可以在纯QML中实现。如果你有时间,请看看我的新例子。我没有足够高的级别来回复人,对不起@folibis@lxchx我删除了您的编辑,因为它没有帮助您理解最初的问题,而是添加了另一个不必要的问题,因此我建议您创建一个新帖子,询问关于第一个方法的新问题(您的新示例),调用Qt.quit()后窗口不会关闭,我收到了警告已发出信号QQmlEngine::quit(),但未连接任何接收器来处理该信号。“。但是我想要的是关闭相应的窗口,而不是什么都不做。关于第二种方法,QQmlEngine使用现有的.qml文件似乎很麻烦,我还没有尝试过,但我会尝试一下。不过,我认为出于这个目的使用此方法很奇怪。如果你有时间,请看看我的新示例。注意:你的新前任ample引入了一个新问题(提示:检查python中的范围概念),因此它无助于理解您最初的问题,所以请删除该编辑。检查您添加的内容,因为它是正确的解决方案,并创建一篇新帖子,询问您的新示例失败的原因。好的,我刚刚开始使用堆栈溢出,不确定这里的一些规则。