Comment attribuez-vous un élément QML à une propriété de composant dans QML, puis utilisez-vous cet objet dans le composant?

J'essaie de créer un objet QML qui agit comme un wrapper pour d'autres objets. Voici mon fichier QML (conteneur.qml):

Item {
    property string label
    property Item control

    Row {
        Label {
            text: label
        }

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

Ce que je voudrais faire (dans mon QML qui consomme ce composant) est quelque chose comme ceci:

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

Lorsqu'il est alimenté par ce QML, le résultat (dans l'interface) devrait ressembler à la sortie de ce QML:

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

Est-ce possible? Lorsque j'essaie de le faire, je reçois "impossible d'assigner un objet à une propriété" lors de l'attribution d'un élément au contrôle propriété. J'ai cherché dans les forums Qt et googlé sans pitié, mais pas de succès. Si quelqu'un connaît la réponse, il serait grandement apprécié.

Merci

Jack

22
demandé sur Jack Benson 2011-02-16 22:47:05

4 réponses

Vous pouvez charger dynamiquement des éléments à l'aide de l'élément Loader, puis définir la propriété 'control' comme un alias qui fait directement référence à la propriété sourceComponent du chargeur.

Donc votre conteneur.qml pourrait ressembler à ceci:

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

    width: 200; height: 200

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

Maintenant, lorsque vous affectez un élément graphique à la propriété' control' , il sera automatiquement affiché par le chargeur.

27
répondu blam 2015-09-15 12:22:21

Il y a une bien meilleure solution:

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

Et maintenant, nous pouvons faire tout ce que nous voulons!

/* main.qml */

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

Merci à l'utilisateur bobbaluba pour avoir suggéré d'utiliser la propriété data plutôt que children.

32
répondu s.maks 2018-01-26 16:41:37

, Vous pouvez créer un conteneur pour d'autres éléments à l'aide d'une propriété personnalisée:

Item
{
    id: root

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

Notez que le parent des éléments Rectangle est défini manuellement afin qu'ils soient des enfants visuels du conteneur.

, Vous pouvez les évaluer comme un tableau javascript

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

Ou

rect.rectList[1].visible = false;
2
répondu Jay 2014-05-16 13:10:04

Utilise QML depuis environ un mois maintenant, aucune idée vraiment comment faire cela, j'ai peur.

Meilleur plan est de comprendre toutes les choses qui le contrôle (Textbox dans votre exemple) pourrait être, créer une instance de chaque composant de votre ligne, et de définir un état correspondant à votre Item. L'état prendrait alors soin de rendre le composant souhaité visible ou invisible selon le cas.

Modifier

Juste pensé. (Je n'ai pas essayé cela mais essayez-le! Dans votre Item's Component.onCompleted: gestionnaire, essayez d'appeler control.createObject(rowID)rowID est un id votre Row objet, (qui vous voulez être le parent de control).

0
répondu funkybro 2011-02-17 13:39:22