QML应用程序块



以下小QML应用程序在运行时将永远阻塞(Qt 5.14.2,Windows 10(。我的想法是创建一个包含业务逻辑的通用App,并在它上面有一个QtUI。当我删除QML中的Scene3D时,不会发生阻塞,所以我认为这个问题在某种程度上与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();
}

应用程序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

App.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();
}

主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"}
}
}
}

我使用了StackView的替换方法作为解决方法。

相关内容

最新更新