Sur cette page

Arbres d'objets et propriété

Vue d'ensemble

QObjects Les objets s'organisent en arbres d'objets. Lorsque vous créez un objet QObject avec un autre objet comme parent, il est ajouté à la liste children() du parent et est supprimé lorsque le parent l'est. Il s'avère que cette approche répond très bien aux besoins des objets de l'interface graphique. Par exemple, un QShortcut (raccourci clavier) est un enfant de la fenêtre correspondante, de sorte que lorsque l'utilisateur ferme cette fenêtre, le raccourci est également supprimé.

QQuickItemL'élément visuel de base du module Qt Quick, QObject, hérite d'un concept de parent visuel différent de celui du parentQObject . Le parent visuel d'un élément n'est pas nécessairement le même que son parent objet. Voir Concepts - Parent visuel dans Qt Quick pour plus de détails.

QWidgetL'enfant, la classe fondamentale du module Qt Widgets, étend la relation parent-enfant. Un enfant devient normalement aussi un widget enfant, c'est-à-dire qu'il est affiché dans le système de coordonnées de son parent et qu'il est graphiquement coupé par les limites de son parent. Par exemple, lorsque l'application supprime une boîte de message après sa fermeture, les boutons et l'étiquette de la boîte de message sont également supprimés, comme nous le souhaitons, car les boutons et l'étiquette sont des enfants de la boîte de message.

Vous pouvez également supprimer vous-même des objets enfants, qui se sépareront alors de leurs parents. Par exemple, lorsque l'utilisateur supprime une barre d'outils, l'application peut supprimer l'un de ses objets QToolBar, auquel cas le parent QMainWindow de la barre d'outils détectera le changement et reconfigurera son espace écran en conséquence.

Les fonctions de débogage QObject::dumpObjectTree() et QObject::dumpObjectInfo() sont souvent utiles lorsqu'une application a un aspect ou un comportement étrange.

Ordre de construction/destruction des QObjets

Lorsque QObjects est créé sur le tas (c'est-à-dire avec new), un arbre peut être construit à partir de ces objets dans n'importe quel ordre, et plus tard, les objets de l'arbre peuvent être détruits dans n'importe quel ordre. Lorsqu'un QObject de l'arbre est supprimé, si l'objet a un parent, le destructeur supprime automatiquement l'objet de son parent. Si l'objet a des enfants, le destructeur supprime automatiquement chaque enfant. Aucun QObject n'est supprimé deux fois, quel que soit l'ordre de destruction.

Lorsque QObjects est créé sur la pile, le même comportement s'applique. Normalement, l'ordre de destruction ne pose toujours pas de problème. Considérons l'extrait suivant :

int main()
{
    QWidget window;
    QPushButton quit("Quit", &window);
    //...
}

Le parent, window, et l'enfant, quit, sont tous deux QObjects parce que QPushButton hérite de QWidget, et QWidget hérite de QObject. Ce code est correct : le destructeur de quit n' est pas appelé deux fois car la norme du langage C++ (ISO/IEC 14882:2003) spécifie que les destructeurs d'objets locaux sont appelés dans l'ordre inverse de leurs constructeurs. Par conséquent, le destructeur de l'enfant, quit, est appelé en premier, et il se retire de son parent, window, avant que le destructeur de window ne soit appelé.

Mais considérons maintenant ce qui se passe si nous intervertissons l'ordre de construction, comme le montre ce deuxième extrait :

int main()
{
    QPushButton quit("Quit");
    QWidget window;

    quit.setParent(&window);
    //...
}

Dans ce cas, l'ordre de destruction pose un problème. Le destructeur du parent est appelé en premier parce qu'il a été créé en dernier. Il appelle ensuite le destructeur de son enfant, quit, ce qui est incorrect car quit est une variable locale. Lorsque quit sort ensuite du champ d'application, son destructeur est à nouveau appelé, cette fois-ci correctement, mais le mal est déjà fait.

© 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.