33

他のオブジェクトのラッパーのように機能する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フォーラムを検索し、これを容赦なくグーグルで検索しましたが、成功しませんでした。誰かが答えを知っているなら、それは大いにありがたいです。

ありがとう

ジャック

4

4 に答える 4

43

はるかに良い解決策があります:

/* 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 {
             /* ... */
        }
    }
}

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

于 2012-04-05T15:09:44.527 に答える
36

Loader要素を使用してアイテムを動的にロードしてから、「control」プロパティを、ローダーのsourceComponentプロパティを直接参照するエイリアスに設定できます。

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

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

    width: 200; height: 200

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

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

于 2011-02-18T02:33:21.853 に答える
2

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

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;
于 2014-05-15T20:08:59.397 に答える
1

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

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

編集

考えただけです。(これを試したことはありませんが、試してみてください!)ItemComponent.onCompleted:ハンドラーで、オブジェクトのcontrol.createObject(rowID)where rowIDisを呼び出してみidてくださいRow(の親になりたいcontrol)。

于 2011-02-17T07:58:31.897 に答える