动态创建qml窗口的正确方法

时间:2017-04-03 15:39:04

标签: qt qml qt-quick

我正在使用Qt应用程序,我需要动态创建窗口。每个窗口都包含基于QObject的c ++后端和基于qml的界面。每个窗口都需要连接到核心类发出的一堆信号。 目前的解决方案是从QQuickView派生窗口,将信号连接到它并使用setSource()加载qml。这是一种正确的方式还是有更好的方法? 是否更好地为所有窗口使用一个QQmlEngine(并将此引擎用作每个窗口的父窗口)或为每个新窗口创建新引擎?

1 个答案:

答案 0 :(得分:1)

为此,我会向QML代码公开c++ model。 由于此模型是动态的(可以添加或删除元素),因此我使用QAbstractItemModel派生模型,该模型可以通知视图添加/删除某些元素。使用像QList<QObject*>这样的其他内容意味着您必须告诉视图每次更改后都应重新加载整个模型。

不是从头开始实现模型,而是使用类似QQmlObjectListModel from Qt QML Tricks的类,它从c ++中公开类似QList的API,但是QAbstractItemModelQObject属性公开为角色在场下。

如果你不想使用QObject,你可以使用的另一个解决方案是benlau's QSyncable(我实际上在你的类似情况下使用它,我在模型中暴露我的屏幕并实例化显示每个任务栏的Window

然后,我使用QQmlApplicationEngine并使用setContextProperty向其展示模型。 QQuickView已经是一个窗口了,所以我不认为您想要使用它,更好地在QML代码中手动管理您的窗口。

然后在您的QML代码中,使用Instantiator作为根对象,设置模型,并使用Window作为其委托:

Instantiator {
    model: yourModel
    Window {
        /* ... */
    }
}