我误解了文档,还是Qt.createQmlObject(几乎)没用?

时间:2017-01-30 20:04:08

标签: qt qml loading qtquick2

来自the Qt docs

  

请注意,此函数会立即返回,因此如果qml字符串加载新组件(即尚未加载的外部QML文件),则该函数可能无效。如果是这种情况,请考虑使用Qt.createComponent()代替。

但据我所知,所有 QML文件都是“外部的”,其中任何一个文件的负载都可能被任意延迟。

E.g。如果我这样做:

Qt.createQmlObject('\
    import QtQuick 2.0\n\
    Rectangle { }
    ',
    parentObject,
    "myRect");

如果在执行此代码时尚未加载Rectangle会发生什么?通过这种逻辑,任何使用Qt.createQmlObject在传递的字符串中导入的代码都是有风险的。因此,我们应该始终使用Qt.createComponent

我很确定我误解了这些文档,但我不知道对它们的正确解释是什么。

1 个答案:

答案 0 :(得分:0)

  

如果在执行此代码时尚未加载Rectangle会发生什么?通过这种逻辑,任何使用Qt.createQmlObject并在传递的字符串中导入的代码都是有风险的。所以我们应该总是使用Qt.createComponent。

对于库类型(如Rectangle),一旦到达某个地方导入语句,它们就立即可用。您的包含文档可能包含这样的导入,以呈现UI,因此Rectangle已经可用于createQmlObject - 那里你不会有太多问题。

对于磁盘上加载的任何东西,获取它们并不是一个非常复杂的过程,所以你应该(根据一些快速测试和代码读取)没问题。据我了解,文档中提到的是关于您可能尝试通过网络加载导入的情况的更多警告,因为这些可能会阻塞不确定的时间。我同意,文件可以更清楚。请考虑在bugreports.qt.io提交文档错误。

有人说,就个人而言,我建议您尽可能避免使用createQmlObject,并使用Qt.createComponent,Component {}等,原因如下:

  • createQmlObject的性能相比并不是很好(因为每次都要创建一个组件,而不是重用一个组件)
  • 你在加载时会丢失警告,并在运行时将它们换成警告(虽然createComponent遇到同样的问题,如果性能问题,这可能是一个可接受的权衡)
  • 当你指出这个问题时,它确实有其他限制