如何在使用 Qt.quit() 而不是整个 QGuiApplication 时只退出当前的 QQmlApplicationEngine?
Posted
技术标签:
【中文标题】如何在使用 Qt.quit() 而不是整个 QGuiApplication 时只退出当前的 QQmlApplicationEngine?【英文标题】:How to only quit current QQmlApplicationEngine while using Qt.quit() instead of the whole QGuiApplication? 【发布时间】:2021-04-04 09:51:25 【问题描述】:我制作这些代码是为了更好地理解我的问题:
main.py
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
app = QGuiApplication([])
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()
按下按钮后,两个窗口都关闭。这不是我所期望的。
【问题讨论】:
请解释一下为什么需要2个引擎? 只是一个例子。事实上,有时我想在一个 .py 文件中创建两个 qml 窗口,但是当一个窗口使用 Qt.quit() 退出时,两个窗口一起退出。我想知道如何在同一个 .py 文件中创建 qml 窗口,而不会使两个窗口相互影响。 我猜QML引擎是一种单例。当然不是这种情况,您可以创建多个实例,但查看文档,例如 qmlRegisterType 没有得到一些引擎指针,那么新类型将注册到哪个引擎?实际上有几个引擎是无稽之谈,你永远不需要它。您想要的一切都可以在纯 QML 中实现。 如果你有时间请看看我的新例子。我的水平不够高,无法回复人,对不起。 @folibis @lxchx 我删除了您的编辑,因为不是帮助理解您最初的问题,而是不必要地添加另一个问题,所以我建议您创建一个新帖子,询问您的新问题(您的新示例) 【参考方案1】:说明
这是the docs 中指出的默认行为:
默认 QQmlEngine 的配置更改列表:
将 Qt.quit() 连接到 QCoreApplication::quit() 自动加载 来自与主 QML 相邻的 i18n 目录的翻译文件 文件。 翻译文件必须有“qml_”前缀,例如qml_ja_JP.qm。 当 QJSEngine::uiLanguage / 时重新加载翻译 Qt.uiLanguage 属性已更改。 自动设置孵化 如果场景包含 QQuickWindow,则为控制器。 自动设置一个 QQmlFileSelector 作为 url 拦截器,将文件选择器应用于 所有 QML 文件和资产。引擎行为可以进一步调整 使用继承自 QQmlEngine 的方法。
(强调我的)
所以有两种选择:
删除连接:
for engine in (engine1, engine2):
engine.disconnect()
使用 QQmlEngine 代替 QQmlApplicationEngine。
适当的解决方案
转到后台问题,即当用户按下按钮时如何关闭窗口,因此您不应该使用Qt.quit()
,而是调用窗口的close()
方法:
import QtQuick.Window 2.14
import QtQuick.Controls 2.15
Window
id: root
visible: true
Button
text: "Button"
onPressed: root.close()
如果你想退出整个应用程序,你应该只使用Qt.quit()
。
【讨论】:
关于第一种方法,调用 Qt.quit() 后窗口没有关闭,并且我收到警告“发出信号 QQmlEngine::quit(),但没有连接接收器来处理它。” .但是我想要的是关闭相应的窗口而不是什么都不做。 关于第二种方法,QQmlEngine使用现有的.qml文件似乎很麻烦,我还没有尝试过,但我会尝试一下。不过,我认为为此目的使用这种方法很奇怪。 如果你有时间请看看我的新例子。 注意:您的新示例引入了一个新问题(提示:查看 python 中的范围概念),因此它无助于理解您的初始问题,因此请删除该编辑。检查您添加的内容,因为它是正确的解决方案并创建一个新帖子,询问您的新示例为何失败。 好的,我刚开始使用 Stack Overflow,不确定这里的一些规则。以上是关于如何在使用 Qt.quit() 而不是整个 QGuiApplication 时只退出当前的 QQmlApplicationEngine?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Objective C中仅弯曲UIView的顶角而不是整个视图?