Árboles de objetos y propiedad
Visión general
QObjects se organizan en árboles de objetos. Cuando se crea un QObject con otro objeto como padre, se añade a la lista children() del padre, y se elimina cuando el padre lo es. Resulta que este enfoque se adapta muy bien a las necesidades de los objetos GUI. Por ejemplo, un QShortcut (atajo de teclado) es hijo de la ventana correspondiente, así que cuando el usuario cierra esa ventana, el atajo también se borra.
QQuickItem, el elemento visual básico del módulo Qt Quick, hereda de QObject, pero tiene un concepto de padre visual que difiere del del padreQObject . El padre visual de un elemento puede no ser necesariamente el mismo que su padre objeto. Véase Conceptos - Padre visual en Qt Quick para más detalles.
QWidget, la clase fundamental del módulo Qt Widgets, amplía la relación padre-hijo. Un hijo normalmente también se convierte en un widget hijo, es decir, se muestra en el sistema de coordenadas de su padre y está recortado gráficamente por los límites de su padre. Por ejemplo, cuando la aplicación borra un cuadro de mensaje después de haberlo cerrado, los botones y la etiqueta del cuadro de mensaje también se borran, tal y como querríamos, porque los botones y la etiqueta son hijos del cuadro de mensaje.
También se pueden eliminar objetos hijos, y éstos se eliminarán a su vez de sus padres. Por ejemplo, cuando el usuario elimina una barra de herramientas puede hacer que la aplicación elimine uno de sus objetos QToolBar, en cuyo caso el padre de la barra de herramientas QMainWindow detectaría el cambio y reconfiguraría su espacio en pantalla en consecuencia.
Las funciones de depuración QObject::dumpObjectTree() y QObject::dumpObjectInfo() suelen ser útiles cuando una aplicación tiene un aspecto o un comportamiento extraño.
Orden de Construcción/Destrucción de QObjects
Cuando QObjects son creados en el heap (es decir, creados con new), un árbol puede ser construido a partir de ellos en cualquier orden, y más tarde, los objetos en el árbol pueden ser destruidos en cualquier orden. Cuando se elimina cualquier QObject del árbol, si el objeto tiene un padre, el destructor elimina automáticamente el objeto de su padre. Si el objeto tiene hijos, el destructor elimina automáticamente cada hijo. Ningún QObject se borra dos veces, independientemente del orden de destrucción.
Cuando se crea QObjects en la pila, se aplica el mismo comportamiento. Normalmente, el orden de destrucción no presenta ningún problema. Considere el siguiente fragmento:
int main() { QWidget window; QPushButton quit("Quit", &window); //... }
El padre, window, y el hijo, quit, son ambos QObjects porque QPushButton hereda de QWidget, y QWidget hereda de QObject. Este código es correcto: el destructor de quit no se llama dos veces porque el estándar del lenguaje C++ (ISO/IEC 14882:2003) especifica que los destructores de objetos locales se llaman en el orden inverso al de sus constructores. Por lo tanto, el destructor del hijo, quit, es llamado primero, y se elimina a sí mismo de su padre, window, antes de que el destructor de window sea llamado.
Pero ahora considera lo que ocurre si intercambiamos el orden de construcción, como se muestra en este segundo fragmento:
int main() { QPushButton quit("Quit"); QWidget window; quit.setParent(&window); //... }
En este caso, el orden de destrucción causa un problema. El destructor del padre es llamado primero porque fue creado en último lugar. Luego llama al destructor de su hijo, quit, lo cual es incorrecto porque quit es una variable local. Cuando quit sale del ámbito, su destructor es llamado de nuevo, esta vez correctamente, pero el daño ya está hecho.
© 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.