动态创建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,但它是 QAbstractItemModel
将 QObject
属性公开为场景下的角色。
如果您不想使用 QObjects,您可以使用的另一种解决方案是 benlau's QSyncable
(我实际上在与您类似的情况下使用过它,我在模型中公开我的屏幕并实例化Window
显示每个任务栏)。
然后,我将使用 QQmlApplicationEngine
并使用 setContextProperty
将模型暴露给它。 QQuickView
已经是 window,所以我认为您不想使用它,最好在 QML 代码中手动管理您的 windows。
然后在您的 QML 代码中,使用 Instantiator
作为您的根对象,设置您的模型,并使用 Window
作为其委托:
Instantiator {
model: yourModel
Window {
/* ... */
}
}
我正在开发 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,但它是 QAbstractItemModel
将 QObject
属性公开为场景下的角色。
如果您不想使用 QObjects,您可以使用的另一种解决方案是 benlau's QSyncable
(我实际上在与您类似的情况下使用过它,我在模型中公开我的屏幕并实例化Window
显示每个任务栏)。
然后,我将使用 QQmlApplicationEngine
并使用 setContextProperty
将模型暴露给它。 QQuickView
已经是 window,所以我认为您不想使用它,最好在 QML 代码中手动管理您的 windows。
然后在您的 QML 代码中,使用 Instantiator
作为您的根对象,设置您的模型,并使用 Window
作为其委托:
Instantiator {
model: yourModel
Window {
/* ... */
}
}