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

QML Component loader vs separate file for reusing items

在我的应用程序(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 负载?

谢谢!!

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

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

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

使用第一种方法,除非:

  1. 您需要根据某些运行时条件有条件地加载 QML。请注意,file selectors 在这方面比 Loader 更有效,但可能无法使用它们,具体取决于您的要求。
  2. 您希望避免加载昂贵的 QML,直到绝对必要(延迟加载)。

您应该特别小心使用 Loader 加载大量创建的组件(例如在视图中用作委托的组件),因为它不是免费提供的。

澄清 Mitch 提供的部分答案:

You should especially be wary of using Loader to load components that are created in large numbers (such as those used as delegates in views), as it doesn't come for free.

使用 Loader 作为委托来创建其他对象没有意义 except for a very narrow case。您可以直接并且绝对应该使用 YourItem {} 作为委托。特别是在视图委托中延迟实例化不是一个好主意,因为这会弄乱视图布局,缺少实际项目的尺寸,如果不加载它就无法确定。即使在 Loader 不是顶级元素而是嵌套的情况下,也不会出现问题,因为 QML 视图仅为视图中的对象实例化委托对象,如果您的模型有 10k 个对象,则它不像你将拥有 10k 加载器,除非它们都在视图中,这......我不会有太多视图。

另外,如果你真的需要动态实例化,那么你至少需要一个Item作为父级使用,所以[=的开销10=] 变得可以忽略不计,并且可以很好地权衡额外的灵活性和功能,例如为项目使用绑定或设置动态源组件。你可以用 Item 来做到这一点,但你必须自己实现它,最终它会比 Loader.

产生更大的开销

任何一种方法的 CPU 时间都不会有什么不同。现在,如果您手动动态创建大量对象,您绝对不需要也不应该使用加载程序。不是因为 CPU 时间,而是因为内存使用 - QML 对象是内存大户,几千个中等复杂度的对象可能 运行 你在 32 位构建上遇到严重的麻烦,尤其是在移动设备。即使是空的、不可见的 QtObject 也像 160 个字节。除了 JS 垃圾回收在释放资源方面几乎是一个笑话,它在重用方面会做得很好。例如,如果您创建 1 GB 的视觉项目,然后删除它们并强制进行垃圾回收,您只会收回一小部分内存,但如果您再次创建这些对象,内存使用量将几乎相同 +/-几兆。