Liaison de propriétés
Une propriété d’un objet peut se voir attribuer une valeur statique qui reste constante jusqu’à ce qu’une nouvelle valeur lui soit explicitement attribuée. Cependant, pour tirer pleinement parti de QML et de sa prise en charge intégrée des comportements dynamiques des objets, la plupart des objets QML utilisent des liaisons de propriétés.
Les liaisons de propriétés constituent une fonctionnalité essentielle de QML qui permet aux développeurs de définir des relations entre différentes propriétés d'objets. Lorsque la valeur des dépendances d'une propriété change, celle-ci est automatiquement mise à jour conformément à la relation spécifiée.
En arrière-plan, le moteur QML surveille les dépendances de la propriété (c'est-à-dire les variables de l'expression de liaison). Lorsqu'un changement est détecté, le moteur QML réévalue l'expression de liaison et applique le nouveau résultat à la propriété.
Présentation générale
Pour créer une liaison de propriété, on attribue à une propriété une expression JavaScript dont le résultat correspond à la valeur souhaitée. Dans sa forme la plus simple, une liaison peut être une référence à une autre propriété. Prenons l’exemple suivant, dans lequel la hauteur de l’ Rectangle e bleue est liée à la hauteur de son parent :
Chaque fois que la hauteur du rectangle parent change, celle du rectangle bleu est automatiquement mise à jour pour prendre la même valeur.
Un lien peut contenir n'importe quelle expression ou instruction JavaScript valide, car QML utilise un moteur JavaScript conforme aux normes. Les liens peuvent accéder aux propriétés d'un objet, appeler des méthodes et utiliser des objets JavaScript intégrés tels que Date et Math. Voici d'autres liens possibles pour l'exemple précédent :
height: parent.height / 2
height: Math.min(parent.width, parent.height)
height: parent.height > 100 ? parent.height : parent.height/2
height: {
if (parent.height > 100)
return parent.height
else
return parent.height / 2
}
height: someMethodThatReturnsHeight()Voici un exemple plus complexe impliquant davantage d’objets et de types :
Column {
id: column
width: 200
height: 200
Rectangle {
id: topRect
width: Math.max(bottomRect.width, parent.width/2)
height: (parent.height / 3) + 10
color: "yellow"
TextInput {
id: myTextInput
text: "Hello QML!"
}
}
Rectangle {
id: bottomRect
width: 100
height: 50
color: myTextInput.text.length <= 10 ? "red" : "blue"
}
}Dans l'exemple précédent,
topRect.widthdépend debottomRect.widthetcolumn.widthtopRect.heightdépend decolumn.heightbottomRect.colordépend demyTextInput.text.length
De plus, toutes les propriétés référencées au sein d’une fonction JavaScript qui est elle-même utilisée comme liaison seront réévaluées. Par exemple, dans l’extrait de code ci-dessous, chaque fois que la propriété enabled de l’ Rectangle change, les liaisons pour les propriétés x et y seront réévaluées :
Rectangle {
x: rectPosition()
y: rectPosition()
width: 200
height: 200
color: "lightblue"
function rectPosition() {
return enabled ? 0 : 100
}
}D'un point de vue syntaxique, les liaisons peuvent présenter une complexité arbitraire. Cependant, si une liaison est trop complexe — par exemple si elle comporte plusieurs lignes ou des boucles impératives —, cela peut indiquer qu’elle est utilisée à d’autres fins que la simple description des relations entre propriétés. Les liaisons complexes peuvent nuire aux performances, à la lisibilité et à la maintenabilité du code. Il peut être judicieux de repenser les composants comportant des liaisons complexes, ou au moins d’extraire la liaison dans une fonction distincte. En règle générale, les utilisateurs ne doivent pas se fier à l’ordre d’évaluation des liaisons.
Création de liaisons de propriétés à partir de JavaScript
Une propriété dotée d’un lien est automatiquement mise à jour si nécessaire. Cependant, si une valeur statique est ultérieurement attribuée à la propriété via une instruction JavaScript, le lien sera supprimé.
Par exemple, l'Rectangle ci-dessous garantit initialement que sa propriété height est toujours le double de sa propriété width. Cependant, lorsque la touche espace est enfoncée, la valeur actuelle de width*3 est attribuée à height en tant que valeur statique. Par la suite, la propriété height restera fixée à cette valeur, même si la propriété width change. L'attribution de la valeur statique supprime le lien.
import QtQuick 2.0
Rectangle {
width: 100
height: width * 2
focus: true
Keys.onSpacePressed: {
height = width * 3
}
}Si l’objectif est de donner au rectangle une hauteur fixe et d’empêcher les mises à jour automatiques, cela ne pose aucun problème. En revanche, si l’objectif est d’établir une nouvelle relation entre width et height, la nouvelle expression de liaison doit alors être placée dans la fonction Qt.binding() :
import QtQuick 2.0
Rectangle {
width: 100
height: width * 2
focus: true
Keys.onSpacePressed: {
height = Qt.binding(function() { return width * 3 })
}
}Désormais, lorsque l'on appuie sur la touche espace, la hauteur du rectangle continuera à s'ajuster automatiquement pour rester toujours trois fois supérieure à sa largeur.
Débogage de la réécriture des liaisons
Une cause fréquente de bogues dans les applications QML est la réécriture accidentelle de liaisons par des valeurs statiques issues d'instructions JavaScript. Pour aider les développeurs à identifier ce type de problèmes, le moteur QML est capable d'émettre des messages chaque fois qu'une liaison est perdue à la suite d'affectations impératives.
Pour générer ces messages, vous devez activer la sortie d'informations pour la catégorie de journalisation « qt.qml.binding.removal », par exemple en appelant :
QLoggingCategory::setFilterRules(QStringLiteral("qt.qml.binding.removal.info=true"));Veuillez vous reporter à la documentation d’ QLoggingCategory pour plus d’informations sur l’activation de la sortie des catégories de journalisation.
Notez qu’il est tout à fait raisonnable, dans certaines circonstances, de remplacer les liaisons. Tout message généré par le moteur QML doit être considéré comme une aide au diagnostic, et non nécessairement comme la preuve d’un problème sans enquête plus approfondie.
Utilisation de ` this ` avec les liaisons de propriétés
Lors de la création d’un liaisons de propriété à partir de JavaScript, le mot-clé ` this ` peut être utilisé pour désigner l’objet qui reçoit la liaison. Cela permet de résoudre les ambiguïtés liées aux noms de propriétés.
Par exemple, le gestionnaire « Component.onCompleted » ci-dessous est défini dans la portée de « Item ». Dans cette portée, « width » fait référence à la largeur de « Item », et non à celle de « Rectangle ». Pour lier la propriété « height » de « Rectangle » à sa propre propriété « width », l'expression de liaison doit faire explicitement référence à « this.width » (ou, alternativement, à « rect.width ») :
Item {
width: 500
height: 500
Rectangle {
id: rect
width: 100
color: "yellow"
}
Component.onCompleted: {
rect.height = Qt.binding(function() { return this.width * 2 })
console.log("rect.height = " + rect.height) // prints 200, not 1000
}
}Remarque : la valeur de ` this ` n’est pas définie en dehors des liaisons de propriétés. Voir Restrictions de l’environnement JavaScript pour plus de détails.
Voir également Positionnement à l'aide d'ancres.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.