添加大量的QML使用QQuickView QWidget应用程序中的对象或QQuickWidget带



我正在开发一个Qt应用程序,其中用户可以在QGraphicsScene中添加QML对象。列出了可用的QML对象,用户可以添加任意数量的对象。

直到现在,我使用QQuickWidgets。QGraphicsScene包含一个顶级小部件,它是我创建的所有QQuickWidgets的父部件。它工作得很好,但我有一个性能问题。如果对象数量太多,应用程序就会开始变慢,并且占用太多的RAM空间(我创建的第一个示例超过1.5 GB,包含400个对象)。

我认为它来自QQuickWidgets由Qt处理的方式,并想尝试另一种方式,与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);

创建表示对象的qquickview:

QQuickView *view = new QQuickView(_engine, _rootView);
view->setSource(url);
view->setResizeMode(QQuickView::SizeViewToRootObject);
view->show();

它工作,但问题是,每个QQuickView创建自己的线程,这不会改变我处理它的方式,但发生在内存中。我不明白为什么,因为我把它们表示为根视图。

所以我的问题如下:

1 -有没有办法防止QQuickViews创建自己的线程?

2 -是否使用QQuickViews,确实,更少的内存消耗比使用QQuickWidgets ?

3 -如果没有,我如何处理在QWidget视图中添加大量QML对象而不消耗太多内存?

我认为使用多个qquickview是一个坏主意。一个应用程序通常只需要一个。我会看一下QQmlComponent。下面是一个例子:

QQmlComponent component(_engine, QUrl::fromLocalFile("MyItem.qml"));
QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
childItem->setParentItem(_rootView);

我绝不是QML专家。然而,这里有一些我能想到的指针

  1. 避免混用和匹配QQuick: widget/View.
  2. 考虑动态创建对象
    • 你也可以使用loader,但是它们有少量额外的开销。
  3. 考虑使用堆栈/滑动视图之类的东西来最小化加载对象的数量。

为了获得最佳投资回报率,我首先尝试实现堆栈视图之类的东西,看看它对RAM有多大帮助。然后根据需要动态创建其他对象。

最后,我认为QT有一个工具可以让您在运行时看到QML树的内存量。您可以查看它并查看最大的内存消耗在哪里。

相关内容

  • 没有找到相关文章

最新更新