web-dev-qa-db-ja.com

QMLのコンポーネントプロパティにQMLアイテムを割り当て、そのオブジェクトをコンポーネント内でどのように使用しますか?

他のオブジェクトのラッパーのように機能するQMLオブジェクトを作成しようとしています。これが私のQMLファイル(Container.qml)です。

Item {
    property string label
    property Item control

    Row {
        Label {
            text: label
        }

        // Not sure how to display the control assigned to the control property
    }
}

(このコンポーネントを使用する私のQMLで)私がやりたいことは次のようなものです:

Container {
    label: "My Label"
    control: Textbox {
        text: "My Value"
    }
}

そのQMLが供給されると、結果(インターフェース内)は、このQMLからの出力に似たものになるはずです。

Item {
    Row {
        Label {
            text: "My Label"
        }
        Textbox {
            text: "My Value"
        }
    }
}

これは可能ですか?これを行おうとすると、コントロールプロパティに項目を割り当てるときに「プロパティにオブジェクトを割り当てられません」というメッセージが表示されます。私はQtフォーラムを検索し、これを容赦なくグーグル化しましたが、成功しませんでした。誰かが答えを知っていれば、それは非常に高く評価されます。

ありがとう

ジャック

30
Jack Benson

Loader 要素を使用してアイテムを動的にロードし、「control」プロパティを alias に設定して、ローダーのsourceComponentプロパティ。

したがって、Container.qmlは次のようになります。

Item {
    property string label
    property alias control : loader.sourceComponent

    width: 200; height: 200

    Row {
        Label { text: label }
        Loader { id: loader }
    }
}

これで、グラフィックアイテムを 'control'プロパティに割り当てると、ローダーによって自動的に表示されます。

31
blam

より良い解決策があります:

/* MyObject.qml */

Rectangle {
    default property alias data /* name can be any */ : inner_space.data

    /* ... You can put other elements here ... */
    Item {
       id: inner_space

       /* ... Params ... */
    }
    /* ... You can put other elements here ... */
}

そして今、私たちは望むすべてを行うことができます!

/* main.qml */

Rectangle {
    MyObject {
        Button {
             /* ... */
        }
    }
}

ユーザーに感謝 bobbalubadataではなくchildrenプロパティの使用を提案してくれた。

36
s.maks

カスタムプロパティを使用して、他のアイテムのコンテナを作成できます。

Item
{
    id: root

    property list<Item> rectList: [
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        }
    ]
}

四角形項目の親は手動で設定されるため、それらはコンテナの視覚的な子になります。

あなたはそれらをjavascript配列として評価することができます

for ( var i = 0; i < root.rectList.length; i++ )
{
   var rect = root.rectList[i];
   rect.visible = true;
}

または

rect.rectList[1].visible = false;
2
Jay

約1か月間QMLを使用していますが、実際にこれを行う方法はわかりません。

最善の計画は、コントロール(例ではTextbox)で可能なすべてのことを把握し、行に各コンポーネントのインスタンスを作成して、Itemに対応する状態を設定することです。次に、状態は、必要に応じて目的のコンポーネントを表示または非表示にする処理を行います。

編集

ただ考えました。 (これを試したことはありませんが、試してみてください!)Itemの_Component.onCompleted:_ハンドラで、control.createObject(rowID)を呼び出してみてください。ここで、rowIDid _Rowオブジェクト(controlの親にしたいオブジェクト)。

1
funkybro