【问题标题】:QML Component loader vs separate file for reusing itemsQML 组件加载器与用于重用项目的单独文件
【发布时间】:2016-09-30 07:45:16
【问题描述】:

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

谢谢!!

【问题讨论】:

  • 这并不重要。两者的工作方式相同。使用加载器可能会多使用几百字节的内存。

标签: qt qml qt-quick


【解决方案1】:

使用第一种方法,除非:

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

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

【讨论】:

    【解决方案2】:

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

    您应该特别小心使用 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 的可视项目,然后删除它们并强制进行垃圾回收,您只会获得一小部分内存,但如果您再次创建对象,内存使用量将几乎相同 +/-几兆字节。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-02
        • 2020-02-27
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2019-05-06
        相关资源
        最近更新 更多