c++ 如何以编程方式无错误地关闭Qt qml应用程序?

vu8f3i0k  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(308)

我想以编程方式关闭qml qt应用程序。我尝试了此处描述的方法如何在Qt QML中退出C++应用程序

Qt.callLater(Qt.quit)

通过qml并使用

QObject::connect(&engine, &QQmlApplicationEngine::quit, &QGuiApplication::quit);

我还尝试使用qcoreapplication::quit()从c++关闭应用程序。qt文档中描述的方法通过信号和插槽调用插槽qguiapplication::quit。
问题是应用程序关闭时出现错误:
"程序意外结束。""进程被强制结束。"
如果我用一个标准的十字架关闭应用程序,那么问题就不会出现。
我怀疑问题出在QQmlApplicationEngine上。因为如果我把engine.load(url);则应用程序正确关闭。
我使用QT 5.13.0最小GW和QT 5.13.0 MSVC2017(32和64)。
如果我在调试中运行,应用程序会给出一个错误,但这个错误绝对没有提供任何信息。

下面是我应用程序代码c++:

#include <QGuiApplication>
#include <QTimer>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    engine.load(url);

    QTimer* timer=new QTimer();
    QObject::connect(timer, &QTimer::timeout, &app, &QGuiApplication::quit, Qt::QueuedConnection);
    timer->start(2000);

    return app.exec();
}

和代码qml文件:

import QtQuick 2.12
import QtQuick.Window 2.12

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

更新:
我试着编译Qt5.9.9 Qt5.13.0 QT5.15,这个问题到处都是。但是当我用Qt6.4版本编译时,这个问题消失了,应用程序正确地终止了。不管怎样,我会把这个问题留着讨论。

mfuanj7w

mfuanj7w1#

正如JarMan指出的,QTimer::singleShot()可以用来关闭应用程序,实际上,这是直接从文档www.example.com中提供的示例https://doc.qt.io/qt-6/qtimer.html#singleShot:

#include <QApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTimer::singleShot(600000, &app, SLOT(quit()));
    ...
    return app.exec();
}

相关问题