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
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.
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
.
, 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;
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)
où rowID
est un id
votre Row
objet, (qui vous voulez être le parent de control
).