QML: Comment puis-je transmettre des propriétés de modèle à un délégué chargé dans un délégué GridView (ou ListView)?
Je suis d'essayer de construire une réutilisables QML Composant interne hôtes un GridView. Chaque élément dans le contrôle GridView a un ensemble de comportements (surtout de l'affichage et de la souris à base de trucs) qui est commun dans toute l'application. Cependant, ce qui est affiché à l'intérieur de la GridView éléments de modifications en fonction du cas d'utilisation. (C'est le même Composant encapsulé pour une GridView, mais ailleurs, dans l'application, il peut utiliser un autre Composant.)
Donc, ce que je voudrais faire est d'avoir chaque invocation offre un délégué qui est ajouté à chaque élément dans le contrôle GridView, ce qui est déjà un délégué. En d'autres termes, quelque chose comme ceci:
MyGrid.qml
import QtQuick 1.1
Rectangle {
id: myGrid
objectName: "myGrid"
property Component internalDelegate
property variant internalModel
GridView {
anchors.fill: parent
delegate: Row {
Loader {
sourceComponent: myGrid.internalDelegate
}
}
model: parent.internalModel
}
}
L'idée est que le Chargeur à l'intérieur de la GridView délégué des charges fourni par l'utilisateur délégué, qui ressemblerait à quelque chose comme ceci:
Principal.qml
import QtQuick 1.1
Rectangle {
anchors.fill: parent
width: 300
height: 200
MyGrid {
anchors.fill: parent
internalDelegate: Text {
text: name
}
internalModel: ListModel {
ListElement {
name: "a"
}
ListElement {
name: "b"
}
}
}
}
Toutefois, cela ne fonctionne pas. QML rapports que le "nom" est une variable inconnue à l'intérieur de l'élément de Texte. Si je remplace le nom de la variable une chaîne de caractères (c'est à dire "bonjour"), il fonctionne comme prévu.
Ma question est, comment puis-je passer le "nom" de la variable à internalDelegate, ou mieux encore, l'ensemble du Modèle de disponible, donc internalDelegate pouvez accéder à tous (depuis l'appelant est la définition du modèle).
Un côté la question est: Est-il une meilleure façon de le faire?
source d'informationauteur Jim Nelson | 2011-12-09
Vous devez vous connecter pour publier un commentaire.
Je l'ai résolu comme ceci:
MyGrid.qml
principal.qml
Ne sais pas si c'est "mieux", mais il a moins et la plus simple de code. La liste des modèles sont un peu maladroit et pas vraiment cohérent dans QML.
Et gardez à l'esprit que modèle.get(index) est la propriété de la GridView parce que l'ensemble du modèle est détenue par. Donc, si vous voulez utiliser l'objet après la liste a été détruit, vous devez reparent ou de le copier.
Veux juste souligner que "la grille.de modèle.get(modèle.index)" ici:
Est l'équivalent de "modèle" dans l'actuel contexte:
Je vais répondre à ma propre question car j'ai continué à travailler sur le problème et trouvé une solution acceptable. Je ne suis pas de marquage à cette question que répond (encore) parce que je voudrais savoir si il y a de plus facile ou plus efficace des solutions.
Voici comment j'ai résolu ce problème: j'ai utilisé le composant de Liaison avec le Chargeur et créé une coutume MyDelegate composant qui a une variante de la propriété pour le modèle actuel de ListElement. Voici le code modifié avec d'importantes modifications marquées par des commentaires.
Principal.qml
MyGrid.qml
Le plus crucial est une coutume MyDelegate composant, qui définit le modèle de la propriété comme une variante. Cela se lie à l'interprétation-temps, en signifiant que il n'y a pas d'erreur dans la Main.qml lorsque le nom du modèle de la propriété est référencé.
MyDelegate.qml
Quelque chose me dit, il y a une manière plus simple de faire cela, mais cela fonctionne pour l'instant.