QT QML - 在C ++中显示现有ApplicationWindow中的Rect

时间:2017-01-15 16:01:14

标签: c++ qt qml

我有Qt Project(Windows,桌面)以及几个QMl文件。我的 main.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();
    }

main.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 )。它们的行为类似于窗口(可拖动,可调整大小......)。

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

我当然可以使用

main.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 {}
    } 

但我不希望他们从一开始就在那里。我想在C ++中使用HandlerObject(或其他东西)来管理由window.qml文件生成的Windows列表,并且可以使用函数打开和关闭它们。这可能吗?

干杯

1 个答案:

答案 0 :(得分:0)

假设您希望每个窗口都有一个C ++数据集,我的建议是实现一个提供此数据的QAbstractListModel派生类,模型的每个“行”都有一个Window的数据。

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方面,您使用Repeater,其中Windowdelegate,C ++提供的模型为model

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