QT QML-отображение Rect в существующем ApplicationWindow из C++

У меня есть проект Qt (Windows, Desktop) вместе с несколькими файлами QMl. Моя главная.cpp выглядит так (упрощено):

    int main(int argc, char *argv[]) {
       QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
       QGuiApplication app(argc, argv);

       QQmlApplicationEngine engine;
       engine.load(QUrl(QLatin1String("qrc:/QMLFiles/main.qml")));

       return app.exec();
    }

Главная.qml это:

    import QtQuick 2.7
    import QtQuick.Controls 2.0
    import QtQuick.Layouts 1.0
    import QtQuick.Window 2.0

    ApplicationWindow {
       id: mainWindow
       objectName: "mainWindow"
       visibility: "Maximized"
       title: "Title goes here"
    } 

У меня также есть некоторые файлы qml ( window.qml), который я хочу отобразить в окне Apllication. Они ведут себя как окна (перетаскиваемые, изменяемые,…).

    import QtQuick 2.7
    import QtQuick.Window 2.0
    //Removed MouseAreas and children
    Rectangle {
       id: rect
       objectName: "rect"
       width: 400
       height: 400
       x: 100
       y: 100
       border.width: 2
       border.color: "black"
   }

Я, конечно, могу назвать их в основном.QML файл с

    import QtQuick 2.7
    import QtQuick.Controls 2.0
    import QtQuick.Layouts 1.0
    import QtQuick.Window 2.0

    ApplicationWindow {
       id: mainWindow
       objectName: "mainWindow"
       visibility: "Maximized"
       title: "Title goes here"
       //New:
       Window {}
    } 

Но я не хочу, чтобы они были там с самого начала. Мне нужен HandlerObject (или что-то) в C++, который управляет списком окон, генерируемых окном.QML файл и может открывать и закрывать их с помощью функции. Возможно ли это?

Овации

1 ответ

  1. Предполагая, что вы хотите иметь набор данных C++ для каждого окна, я бы предложил реализовать QAbstractListModelпроизводный класс, который предоставляет эти данные, каждая «строка» модели, имеющая данные для одного окна.

    class WindowModel : public QAbstractListModel
    {
        Q_OBJECT
    
    // ....
    };
    

    Предоставление экземпляра этой модели QML

    WindowModel windowModel;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("_windowModel", &windowModel);
    engine.load(QUrl(QLatin1String("qrc:/QMLFiles/main.qml")));
    

    На стороне QML вы затем используете a Repeaterв Windowкачестве its delegateи модель c++, предоставленную в качестве its model.

    Repeater {
        model: _windowModel
        delegate: Window {
            // access data provided by the model
        }
    }