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

是我误解了文档,还是Qt.createQmlObject(几乎)没用?,qt,qml,loading,qtquick2,Qt,Qml,Loading,Qtquick2,发件人: 请注意,如果qml字符串加载新组件(即尚未加载的外部qml文件),此函数将立即返回,因此可能无法工作。如果是这种情况,请考虑使用Qt.CealCeMoMutual()代替.< /P> 但据我所知,所有QML文件都是“外部”文件,任何文件的加载都可能延迟任意长的时间 例如,如果我这样做: Qt.createQmlObject('\ import QtQuick 2.0\n\ Rectangle { } ', parentObject, "myRec

发件人:

请注意,如果qml字符串加载新组件(即尚未加载的外部qml文件),此函数将立即返回,因此可能无法工作。如果是这种情况,请考虑使用Qt.CealCeMoMutual()代替.< /P> 但据我所知,所有QML文件都是“外部”文件,任何文件的加载都可能延迟任意长的时间

例如,如果我这样做:

Qt.createQmlObject('\
    import QtQuick 2.0\n\
    Rectangle { }
    ',
    parentObject,
    "myRect");
如果在执行此代码时矩形尚未加载,会发生什么情况?根据此逻辑,在传递的字符串中使用导入的
Qt.createQmlObject
的任何代码都有风险。因此,我们应该始终使用
Qt.createComponent

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

如果在执行此代码时矩形尚未加载,会发生什么情况?根据此逻辑,在传递的字符串中使用Qt.createQmlObject和导入的任何代码都有风险。因此,我们应该始终使用Qt.createComponent

对于库类型(如矩形),一旦到达某个地方的import语句,它们就立即可用。您的包含文档可能包含这样一个导入,以呈现一个UI,所以矩形对于createQmlObject已经是可用的了—您在这方面不会有太多问题

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

提交文档错误。 尽管如此,我个人还是建议您尽可能避免使用createQmlObject,并使用Qt.createComponent、
Component{}
等,原因如下:

  • 相比之下,createQmlObject的性能不是很好(因为它每次都必须创建一个组件,而不是重用一个组件)
  • 您在加载时丢失警告,并在运行时用它们来换取警告(尽管createComponent也遇到同样的问题,如果性能是一个问题,这可能是一个可接受的折衷方案)
  • 正如你在这个问题上指出的,它确实有额外的限制

createComponent()
不同,它不能从内存中的字符串工作,它需要外部文件的uri。这里允许异步加载,而且您可以在同步和异步之间进行选择。@ddriver:我知道。我想说的是,
Qt.createComponent
可能替代
Qt.createQmlObject
,尽管它从uri加载到外部文件,而不是内存中的字符串。而且它没有Qt.createQmlObject似乎存在的致命问题。我还没有测试它,但我怀疑只要文件在本地可用并且模块在导入路径中,createQmlObject就可以了。如果您依赖生成的代码,只需将字符串保存为文件,并使用createComponent以确保安全。