web-dev-qa-db-ja.com

QtQMLでC ++アプリケーションを終了する方法

qtqmlタイプのドキュメントによると

終了する()

この関数により、QQmlEngine :: quit()シグナルが発行されます。 qmlsceneを使用したプロトタイピングでは、これによりランチャーアプリケーションが終了します。このメソッドが呼び出されたときにC++アプリケーションを終了するには、QQmlEngine :: quit()シグナルをQCoreApplication :: quit()スロットに接続します。

したがって、QMLでC++アプリケーションを終了するには、これを呼び出す必要があります

 Qt.quit()

qMLファイル内ですが、QMLエンジンを終了するだけで、C++アプリケーションも閉じる必要があります。

これが私の試みです

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QScopedPointer<NFCclass> NFC (new NFCclass);

    QQmlApplicationEngine engine;


    QObject::connect(engine, QQmlEngine::quit(), app,  QCoreApplication::quit()); 
// here is my attempt at connecting based from what i have understood in the documentation of signal and slots


    engine.rootContext()->setContextProperty("NFCclass", NFC.data());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

あなたが私を助けることができればどうもありがとう:)

QtCoreのオブジェクトがわからないので、その行がエラーをスローするのだと思います

================================================== =========================編集:

Eyllanescによる回答は機能します。

しかし、完了時にQt.quit()を実行すると、終了しません。それはボタンで動作しますが

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

    Component.onCompleted: {
       Qt.quit()
    }

    Button{onClicked: Qt.quit()}

}
5
Jake quin

Qtの新しい接続構文 の使用法を学ぶ必要があります。あなたの場合は次のとおりです。

_QObject::connect(&engine, &QQmlApplicationEngine::quit, &QGuiApplication::quit);
_

更新:

2番目のケースの回避策は、 Qt.callLater() を使用することです。

_ApplicationWindow {
    id:root
    visible: true
    width: 480
    height: 640
    title: qsTr("Hello World")

    Component.onCompleted: {
         Qt.callLater(Qt.quit)
    }
}
_
4
eyllanesc