es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Hay alguna manera de usar QEventLoop como el bucle de eventos principal en una aplicación QML?

Las aplicaciones QML no se cierran cuando se utiliza QEventLoop. La ventana se abrirá correctamente, pero cuando se cierra la ventana de la aplicación, el programa no se cierra. Además, no se generan eventos como QGuiApplication::lastWindowClosed o QQmlApplicationEngine::destroyed. Intenta ejecutar el siguiente ejemplo para ver a qué me refiero. Debes presionar CTRL-C para salir.

“`c++
#include <qguiapplication>
#include <qqmlapplicationengine>
#include <qeventloop>
#include <string>

const std::string qmlStr = R"(
import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
title: "My Application"
width: 640
height: 480
visible: true

<pre><code>Button {
text: "Push Me"
anchors.centerIn: parent
}
</code></pre>

}
)";

int main(int argc, char** argv) {
auto app = new QGuiApplication(argc, argv);
auto m_engine = new QQmlApplicationEngine();

<pre><code>m_engine->loadData(QByteArray::fromStdString(qmlStr));

QObject::connect(QGuiApplication::instance(), &QGuiApplication::aboutToQuit, []() {
qDebug("aboutToQuit");
});

QObject::connect(qGuiApp, &QGuiApplication::lastWindowClosed, []() {
qDebug("lastWindowClosed");
});

QObject::connect(m_engine, &QQmlApplicationEngine::destroyed, []() {
qDebug("Destroyed");
});

QEventLoop loop;
while (loop.isRunning()) {
loop.processEvents(QEventLoop::AllEvents | QEventLoop::WaitForMoreEvents | QEventLoop::EventLoopExec);
}
// loop.exec() tampoco funciona.

return 0;
</code></pre>

}
“`

¿Existe alguna manera de utilizar QEventLoop como el bucle principal de eventos en una aplicación QML?

NOTA: Sí, necesito utilizar QEventLoop como el bucle principal de eventos. qGuiApp->exec() funciona, pero no es lo que necesito.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No, no hay forma de utilizar QEventLoop como el bucle de eventos principal en una aplicación QML sin causar el problema descrito anteriormente, donde el programa no se cierra y no dispara ningún evento como QGuiApplication::lastWindowClosed o QQmlApplicationEngine::destroyed. Se recomienda utilizar qGuiApp->exec() en su lugar, si es posible, ya que cerrará correctamente la aplicación cuando se cierre la última ventana.

Comments are closed.