Блоки приложения QML - PullRequest
       77

Блоки приложения QML

3 голосов
/ 27 апреля 2020

Следующие маленькие приложения 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"}
        }
    }
}

1 Ответ

1 голос
/ 06 мая 2020

Я использовал метод замены StackView в качестве обходного пути.

...