我正在开发一个 Qt 应用程序,其中用户可以在 QGraphicsScene 中添加 QML 对象。列出了可用的 QML 对象,用户可以根据需要添加任意数量的对象。
到目前为止,我使用的是 QQuickWidgets。QGraphicsScene 包含一个顶级小部件,它是我创建的所有 QQuickWidgets 的父级。它工作正常,但我有一个性能问题。对象数量多时,应用程序开始变慢,并占用过多的 RAM 空间(我创建的第一个示例超过 1.5 GB,包含 400 个对象)。
我认为它来自 Qt 处理 QQuickWidgets 的方式,并想尝试另一种方式,使用 QQuickViews。为此,我创建了一个根视图,在 QWidget 中进行了转换,因此我可以将其嵌入到我的视图中,这是一个 QWidget。然后我在根视图中为每个创建的对象添加一个新的 QQuickView。
创建根视图、它的容器和引擎:
_rootView = new QQuickWindow();
_rootView->resize(1024, 720);
_rootView->show();
QWidget *container = QWidget::createWindowContainer(_rootView, this);
container->resize(_rootView->size());
container->setObjectName("TopLevelQmlViewWidget");
_layout->addWidget(container);
_engine = new QQmlEngine(_rootView);
代表对象的 QQuickViews 的创建:
QQuickView *view = new QQuickView(_engine, _rootView);
view->setSource(url);
view->setResizeMode(QQuickView::SizeViewToRootObject);
view->show();
它可以工作,但问题是每个 QQuickView 创建自己的线程,这不会改变我处理它的方式,而是发生在内存中。我不明白为什么,因为我将它们重新设置为根视图。
所以我的问题如下:
1 - 有没有办法阻止 QQuickViews 创建自己的线程?
2 - 使用 QQuickViews 确实比使用 QQuickWidgets 消耗更少的内存吗?
3 - 如果不是,我如何在 QWidget 视图中添加大量 QML 对象而不消耗太多内存?