Qt.createQmlObject()を使用してカスタムqmlオブジェクトインスタンスを作成する

Target.qml というカスタムQMLオブジェクトがあります。私は Qt.createQmlObject()を使ってこのオブジェクトの動的インスタンスを作成したいと思います。

これはImageのような組み込みのqmlオブジェクトを使用するときに機能します:

var newTarget = Qt.createQmlObject('import Qt 4.7; Image {source: "widgets/SlideSwitchImages/knob.png"; }', parent);

しかし、次のようなカスタムオブジェクト型を使用すると失敗します。

var newTarget = Qt.createQmlObject('import Qt 4.7; Target {}', parent);

しかし、QMLでカスタムのTarget型を静的に使用すると、すべてが動作します。これは既知の制限ですか、任意の回避策ですか?

3

2 答え

任意の数のターゲットインスタンスが必要な場合は、Componentを使用する方がよいでしょう。

Component {
    id: targetFactory
    Target {}
}

var newTarget = targetFactory.createObject(parent, properties)

しかし、あなたがQt.createQmlObject呼び出しに固執したいのであれば、私はあなたが別のディレクトリにTargetコンポーネントを持っていると思っています。文字列パラメータは、それを呼び出すディレクトリと同じディレクトリで独自に動作するQMLファイルの内容でなければなりません。

例えば。

var newTarget = Qt.createQmlObject('import QtQuick 1.0; import "../Targets"; Target {}', parent);

BTW:Qt 4.7のインポートは、QtQuickの追加バージョンを許可しないため廃止されました。

4
追加された
こんにちは、コンポーネント工場の提案をありがとう、私はその次回を使用します。私は実際にqml文字列のimport文を見逃しました。それはcreateQmlObjectがそれ自身のスコープを持っているようです。
追加された 著者 Rudolf Meijering,

ドキュメントから:

JavaScriptからオブジェクトを動的に作成するには、2通りの方法があります。 Qt.createComponent()を呼び出してComponentオブジェクトを動的に作成するか、Qt.createQmlObject()を使用してQMLの文字列から項目を作成することができます。 既存のコンポーネントが.qmlファイルで定義されている場合はコンポーネントを作成する方がよい。そのコンポーネントのインスタンスを動的に作成する場合。それ以外の場合は、QMLの文字列から項目を作成すると、項目QML自体が実行時に生成されるときに便利です。

私はこれが、 createQmlObject は、実行時にアイテムタイプを定義しているため、アプリケーションがそのアイテムタイプの存在を認識している場合にのみ機能します。

createComponent seems to perform the same function but for item types pre-defined in .qml files, as in your case.

1
追加された
こんにちは、ありがとうございました。私は実行時に型を定義し、他の型のように静的なqml内で使用することができますが、createQmlObjectメソッドは独自のスコープを持ち、したがって独自のimport文を文字列の一部として必要とします。
追加された 著者 Rudolf Meijering,