动态创建qml的正确方法windows

Right way to dynamically create qml windows

我正在开发 Qt 应用程序,我需要动态创建 windows。每个 window 由基于 QObject 的 c++ 后端和基于 qml 的接口组成。每个 window 都需要连接到核心 类 发出的一堆信号。 当前的解决方案是从 QQuickView 导出 window,将信号连接到它并使用 setSource() 加载 qml。这是正确的方法还是有更好的方法? 是为所有 windows 使用一个 QQmlEngine(并为每个 window 使用此引擎作为父引擎)还是为每个新 window 创建新引擎更好?

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

您可以使用 QQmlObjectListModel from Qt QML Tricks 之类的 class,而不是从头开始实施模型,它公开了来自 c++ 的 QList-like API,但它是 QAbstractItemModelQObject 属性公开为场景下的角色。

如果您不想使用 QObjects,您可以使用的另一种解决方案是 benlau's QSyncable(我实际上在与您类似的情况下使用过它,我在模型中公开我的屏幕并实例化Window 显示每个任务栏)。

然后,我将使用 QQmlApplicationEngine 并使用 setContextProperty 将模型暴露给它。 QQuickView 已经是 window,所以我认为您不想使用它,最好在 QML 代码中手动管理您的 windows。

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

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