QML组件加载器与单独的文件,用于重用项目

时间:2016-09-30 07:45:17

标签: qt qml qt-quick

在我的应用程序(QML,QtQuck 1.1,C ++)中,我想重复使用屏幕上的一些项目。

一般来说有两种选择(如果还有更多,请告诉我)

1.Use a separate .qml file and put the basic block inside and import in new screen
2.Create a component and use loader to load it.

但我无法理解使用哪个选项。

这两个选项之间的区别是什么。

会消耗更少的CPU负载吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

使用第一种方法,除非:

  1. 您需要根据某些运行时条件有条件地加载QML。请注意,file selectors为此目的比Loader更有效,但根据您的要求,可能无法使用它们。
  2. 您希望避免加载昂贵的QML,直到绝对必要(延迟加载)。
  3. 您应该特别警惕使用Loader加载大量创建的组件(例如在视图中用作代理的组件),因为它不是免费提供的。

答案 1 :(得分:1)

澄清米奇提供的部分答案:

  

您应该特别警惕使用Loader加载组件   是大量创建的(例如用作代表的那些)   意见),因为它不是免费的。

使用Loader作为委托来创建其他对象没有意义except for a very narrow case。您可以直接而且绝对应该使用YourItem {}作为代理。特别是延迟视图委托中的实例化并不是一个好主意,因为这会弄乱视图布局,缺少实际项目的维度,如果不加载它就无法确定。即使在Loader不是顶部元素但是嵌套的情况下,它也不会有问题,因为QML视图只实例化视图中对象的委托对象,如果你的模型有10k个对象,它就不像你将拥有10k装载机,除非它们全部在视野中,这对我来说不是很重要。

另外,如果您真的需要动态实例化,那么无论如何您至少需要Item作为父级,因此Loader的开销变得可以忽略不计以及对项目的使用绑定或设置动态源组件等额外灵活性和功能的非常好的权衡。你可以用Item做到这一点,但你必须自己实现它,最终它的开销会比Loader更大。

任何一种方法的CPU时间都没有区别。现在,如果您手动动态创建大量对象,您肯定既不需要也不应该使用加载器。并不是因为CPU时间,而是因为内存使用--QML对象是内存耗尽,几千个中等复杂度的对象可能会让你在32位版本上遇到严重问题,特别是在移动设备上。即使是空的,不可见的QtObject也像160个字节。最重要的是JS垃圾收集在释放资源时几乎是一个笑话,它在重用时会很好。例如,如果您创建1 GB的可视项目,然后删除它们并强制进行垃圾回收,那么您将只获得该内存的一小部分,但如果再次创建对象,则内存使用量将基本相同+/-几兆字节。

答案 2 :(得分:0)

简而言之,在单独的.qml文件中放置全局组件,您将包含并使用不同的文件。 如果仅在一个文件中使用它,则在同一文件中创建组件。

此外,它还取决于组件的大小和复杂程度。大而复杂的组件最好放在单独的文件中。

当所有代码都在一个文件中时编译速度更快,但当所有代码都在其位置时开发速度更快。