Qt의 객체 계층 구조
- self는 부모-자식 관계에서 부모 객체를 나타냅니다. PyQt의 모든 위젯은 QObject에서 상속되며, 부모 객체가 자식 객체의 메모리를 관리합니다. 따라서 부모 객체(self)를 명시하면 자식 위젯은 부모가 소멸될 때 함께 소멸되어 메모리 누수를 방지합니다.
- 부모-자식 관계를 설정하면 자식 위젯이 부모 위젯 내부에 그려지며 부모 위젯의 경계를 벗어나지 않습니다.
self의 사용 목적
- self.name_entry = QLineEdit(self)와 같이 self를 사용하면 클래스의 속성으로 설정되어 클래스 내 다른 메서드에서 접근할 수 있습니다. 반면, name_entry = QLineEdit(self)와 같이 사용하면 해당 메서드 내에서만 접근 가능합니다.
- self를 통해 설정된 위젯은 클래스 전반에서 이벤트 핸들러와 연결하거나 다른 메서드에서 쉽게 조작할 수 있습니다.
레이아웃과 부모 위젯
- 위젯을 레이아웃에 추가하면 부모 위젯이 자동으로 설정됩니다. 따라서 레이아웃을 사용하면 명시적으로 self를 부모로 전달하지 않아도 됩니다.
위젯의 참조 유지
- QLineEdit 같은 위젯은 부모를 지정하지 않거나 참조를 유지하지 않으면 즉시 소멸될 수 있습니다.
- 예를 들어:
def test1(): dialog = QDialog() dialog.show() # 창이 곧 사라질 가능성이 높음
def test2(self):
dialog = QDialog(self)
dialog.show()
추가 고려사항
- 부모가 설정된 경우 자식 위젯은 부모가 보이거나 숨길 때 함께 영향을 받습니다.
- QDialog와 같은 위젯은 부모를 설정하면 모달 대화상자로 동작할 수 있습니다.
결론
self를 사용하여 부모-자식 관계를 명시적으로 설정하면 메모리 관리 및 위젯 표시에서 이점을 얻을 수 있습니다. 또한, 클래스 속성으로 설정하여 다른 메서드에서 쉽게 접근할 수 있습니다. 반면, 특정한 경우에는 레이아웃을 통해 부모-자식 관계가 자동으로 설정되기도 합니다.
In PyQT why somes widgets needs the "self" parameter before calling them, while others don't
I'm a little bit confused about the use of the "self" parameter with some widgets like (QLineEdit), indeed when learning to use the QLabel widget, I used to call the class without the self
stackoverflow.com
'PySide or PyQt' 카테고리의 다른 글
빈 공간 없이 애플리케이션의 크기를 알맞게 조정 (0) | 2025.02.20 |
---|---|
QSizePolicy (0) | 2025.02.20 |
QFileDialog.getOpenFileName()을 사용해서 디렉터리만 선택해 그 경로를 가져오는 코드 (0) | 2025.02.20 |
QDialog, QMain Window, QWidget에 대해서 (0) | 2025.01.15 |