오브젝트 트리 및 소유권
개요
QObjects 객체는 객체 트리에서 스스로를 정리합니다. 다른 개체를 부모로 하여 QObject 을 만들면 부모의 children() 목록에 추가되고, 부모가 삭제되면 삭제됩니다. 이 접근 방식은 GUI 객체의 요구 사항에 매우 잘 맞는 것으로 밝혀졌습니다. 예를 들어 QShortcut (키보드 단축키)는 관련 창의 자식이기 때문에 사용자가 해당 창을 닫으면 단축키도 삭제됩니다.
QQuickItem Qt Quick 모듈의 기본 시각적 요소인 은 에서 상속되지만 QObjectQObject 부모와는 다른 시각적 부모라는 개념을 가지고 있습니다. 항목의 시각적 부모는 반드시 객체 부모와 동일하지 않을 수 있습니다. 자세한 내용은 Qt Quick 의 개념 - 시각적 부모를 참조하세요.
QWidget Qt Widgets 모듈의 기본 클래스는 부모-자식 관계를 확장합니다. 자식은 일반적으로 부모의 좌표계에 표시되고 부모의 경계에 따라 그래픽으로 잘리는 등 자식 위젯이 됩니다. 예를 들어 메시지 상자를 닫은 후 애플리케이션이 메시지 상자를 삭제하면 버튼과 레이블이 메시지 상자의 자식이기 때문에 원하는 대로 메시지 상자의 버튼과 레이블도 삭제됩니다.
또한 사용자가 직접 자식 개체를 삭제하면 해당 개체가 부모 개체에서 스스로 제거됩니다. 예를 들어 사용자가 툴바를 삭제하면 애플리케이션이 QToolBar 개체 중 하나를 삭제할 수 있으며, 이 경우 툴바의 QMainWindow 부모가 변경 사항을 감지하고 그에 따라 화면 공간을 재구성합니다.
디버깅 함수 QObject::dumpObjectTree() 및 QObject::dumpObjectInfo()는 애플리케이션이 이상하게 보이거나 작동할 때 유용한 경우가 많습니다.
QObject의 생성/파괴 순서
힙에 QObjects 이 생성되면(즉, 새로 만들면), 이로부터 어떤 순서로든 트리를 구성할 수 있으며, 나중에 트리의 객체를 어떤 순서로든 소멸할 수 있습니다. 트리의 QObject 개체가 삭제될 때 해당 개체에 부모가 있는 경우 소멸자는 자동으로 해당 부모에서 개체를 제거합니다. 객체에 자식이 있는 경우 소멸자는 각 자식을 자동으로 삭제합니다. QObject 은 삭제 순서에 관계없이 두 번 삭제되지 않습니다.
스택에 QObjects 이 생성된 경우에도 동일한 동작이 적용됩니다. 일반적으로 소멸 순서는 여전히 문제가 되지 않습니다. 다음 스니펫을 고려해 보세요:
int main() { QWidget window; QPushButton quit("Quit", &window); ... }
부모인 window
와 자식인 quit
은 모두 QObjects 인데, QPushButton 은 QWidget 을 상속하고 QWidget 은 QObject 을 상속하기 때문입니다. 이 코드가 올바른 이유는 C++ 언어 표준 (ISO/IEC 14882:2003) 에서 로컬 객체의 소멸자는 생성자의 역순으로 호출하도록 명시하고 있기 때문에 quit
의 소멸자는 두 번 호출되지 않습니다. 따라서 자식인 quit
의 소멸자가 먼저 호출되고 window
의 소멸자가 호출되기 전에 부모인 window
에서 자신을 제거합니다.
하지만 이제 이 두 번째 코드 조각에서와 같이 생성 순서를 바꾸면 어떻게 될지 생각해 보세요:
int main() { QPushButton quit("Quit"); QWidget window; quit.setParent(&window); ... }
이 경우 소멸 순서로 인해 문제가 발생합니다. 부모의 소멸자가 마지막으로 생성되었기 때문에 먼저 호출됩니다. 그런 다음 자식의 소멸자 quit
를 호출하는데, quit
은 지역 변수이므로 올바르지 않습니다. 이후 quit
이 범위를 벗어나면 해당 소멸자가 다시 호출되지만 이번에는 올바르게 호출되지만 이미 손상이 발생한 상태입니다.
© 2025 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.