2017-01-30 1 views
0

:この関数はすぐに戻りますので、QML文字列が新しいコンポーネントをロードする場合は動作しない可能性があること私はドキュメントを誤解していますか、Qt.createQmlObject(ほとんど)役に立たないですか? <a href="http://doc.qt.io/qt-5/qml-qtqml-qt.html#createQmlObject-method" rel="nofollow noreferrer">the Qt docs</a>から

注意(つまり、まだロードされていない外部のQMLファイルです)。このような場合は、Qt.createComponent()を代わりに使用することを検討してください。

しかし、私の知る限り、すべて QMLファイルが「外部」であり、それらのいずれかは、その負荷が長い任意に遅れがあります。

など。私はこれを行う場合:

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

をRectangleが、私はこのコードを実行する時間によってロードされていない場合はどうなりますか?このロジックによって、Qt.createQmlObjectを使用するコードでは、渡された文字列のインポートが危険です。したがって、常にQt.createComponentを代わりに使用する必要があります。

私はこれらのドキュメントを誤解しているとはかなり確信していますが、それらの正しい解釈が何であるか分かりません。

+0

'createComponent()'は異なります。メモリ内の文字列からは機能しません。外部ファイルへのURIが必要です。ここでは非同期読み込みが許可されていますが、同期と非同期のどちらかを選択できます。 – dtech

+0

@ddriver:わかったよ。私が言っていることは、 'Qt.createComponent'は' Qt.createQmlObject'の代わりになる可能性がありますが、メモリ内の文字列ではなく外部のファイルに読み込まれます。そして、 'Qt.createQmlObject'には致命的な問題はありません。 –

+0

私はそれをテストしていないが、ファイルがローカルで利用可能で、モジュールがインポートパスにある限り、createQmlObjectは問題ないと思われる。生成されたコードに依存する場合は、文字列をファイルとして保存し、createComponentを使用するだけで安全な側に置くことができます。 – dtech

答えて

0

このコードを実行するまでにRectangleが読み込まれなかった場合はどうなりますか?このロジックによって、渡された文字列のインポートでQt.createQmlObjectを使用するコードはすべて危険です。したがって、代わりに常にQt.createComponentを使用する必要があります。

ライブラリ型(Rectangleなど)の場合、import文にどこかに到達するとすぐに使用できます。あなたの含まれているドキュメントはUIを提示するためにそのようなインポートを含んでいる可能性が高いので、RectangleはすでにcreateQmlObjectに利用可能です。そこには問題はほとんどありません。

ディスクにロードされているものについても、それらをフェッチするのは非常に複雑なプロセスではないので、(いくつかの簡単なテストとコードの読み方に従って)うまくいくべきです。私が理解しているように、ドキュメンテーションの中には、不確定な時間をブロックする可能性があるため、ネットワーク経由で読み込みを試みる可能性があるという警告があります。ドキュメントはより明確になるかもしれませんが、私は同意します。 bugreports.qt.ioにドキュメントのバグを提出することを検討してください。

この個人的に、私はいくつかの理由のために、など、あなたができる場合は、createQmlObjectを避けることを示唆している、とQt.createComponentを使用し、Component {}だろう、と述べていた。

  • createQmlObjectのパフォーマンスがで素晴らしいではありません(コンポーネントを再利用するのではなく、毎回コンポーネントを作成する必要があります)
  • ロード時に警告が表示されず、実行時に警告が表示されます(createComponentは同じ問題を抱えますが、パフォーマンスが問題です)
  • それは追加の制限があります。
関連する問題

 関連する問題