Следующие маленькие приложения QML блокируются навсегда при запуске (Qt 5.14.2, Windows 10). Моя идея состояла в том, чтобы создать шаблон c App
, содержащий бизнес-логи c, и иметь над ним QtUI
. Блокировка не происходит, когда я удаляю Scene3D в QML, поэтому я думаю, что проблема как-то связана с Qt3D. Я застрял, что я делаю не так?
main. cpp:
#include "QtUI.h"
int main(int argc, char** argv) {
App app;
QtUI gui(app, argc, argv);
app.setUI(&gui);
app.init();
QtUI::exec();
}
App.h:
#ifndef APP_H
#define APP_H
class App {
public:
class UI {
public:
virtual void onFirst() = 0;
virtual void onSecond() = 0;
};
void setUI(UI* ui);
void init();
private:
UI* ui_ = nullptr;
};
#endif
Приложение. cpp :
#include "App.h"
void App::init() {
ui_->onFirst();
ui_->onSecond();
}
void App::setUI(App::UI* ui) {
ui_ = ui;
}
QtUI.h:
#ifndef QTUI_H
#define QTUI_H
#include <QApplication>
#include <QQmlApplicationEngine>
#include "App.h"
class QtUI : public QGuiApplication, public App::UI {
Q_OBJECT
public:
explicit QtUI(App& app, int& argc, char** argv);
void onFirst() override;
void onSecond() override;
signals:
void first();
void second();
private:
App& app_;
QQmlApplicationEngine engine_;
};
#endif
QtUI. cpp
#include "QtUI.h"
#include <QQmlContext>
QtUI::QtUI(App& app, int& argc, char** argv)
: QGuiApplication(argc, argv),
app_(app) {
engine_.rootContext()->setContextProperty("app", this);
engine_.load("qrc:/Main.qml");
}
void QtUI::onFirst() {
emit first();
}
void QtUI::onSecond() {
emit second();
}
Main.qml
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Window 2.14
import QtQuick.Scene3D 2.14
import Qt3D.Core 2.14
import Qt3D.Render 2.14
import Qt3D.Input 2.14
import Qt3D.Extras 2.14
ApplicationWindow {
visible: true
StackView {
id: stack
anchors.fill: parent
}
Connections {
target: app
onFirst: stack.push(first);
onSecond: stack.push(second);
}
Component {
id: first
Item {
Scene3D {
Entity {
components: [
RenderSettings {
activeFrameGraph: ForwardRenderer {
clearColor: "red"
}
}
]
}
}
}
}
Component {
id: second
Item {
Button{ text: "Foo"}
}
}
}