Я столкнулся с этой проблемой, пытаясь переключиться с ApplicationWindow на другой.
У меня есть это первое окно с именем login.qml, которое открывает main.qml через следующий сигнал:
onIdAutenticadoChanged: {
if(idAutenticado > 0){
console.log("login.qml: Autenticado ID: " + idAutenticado);
LoginController.abrirMain();
close();
} else if(idAutenticado == 0){
senhaInput.text = "";
console.log("Falha na autenticação: Usuário e/ou senha inválidos.");
lblMsgErro.text = "Usuário e/ou senha inválidos.";
lblMsgErro.visible = true;
loginInput.focus = true;
}
}
Слот LoginController.abrirMain() загрузит и покажет main.qml
void QLoginController::abrirMain()
{
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("MainController", new QMainController(0,m_autenticado));
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
QQuickWindow* window = qobject_cast<QQuickWindow*>(engine.rootObjects().at(0));
window->showFullScreen();
}
Проблема в том, что main.qml не отображается.
//main.qml
ApplicationWindow {
id: mainWindow
visible: true
modality: "WindowModal"
visibility: "FullScreen"
color: "#09435b"
}
Вопрос: Я использую правильный подход, чтобы открыть это новое окно? Если нет, как мне это сделать?
Потому что вы создаете движок в стеке :), который будет удален автоматически, прежде чем abrirMain()
вернется и, следовательно, уничтожит это окно тоже.
Вы должны создать движок в куче. Что-то вроде этого:
// 'this' will become engine parent and will automaticlaly delete engine when 'this' is deleted
QQmlApplicationEngine *engine = new QQmlApplicationEngine(this);
engine->rootContext()->setContextProperty("MainController", new QMainController(0,m_autenticado));
engine->load(QUrl(QStringLiteral("qrc:///main.qml")));
QQuickWindow* window = qobject_cast<QQuickWindow*>(engine->rootObjects().at(0));
window->showFullScreen();