본문 바로가기
PySide or PyQt

위젯 생성할 때 self를 파라미터에 왜 넣을까?

by 르면가게 2025. 1. 15.

 

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()  # 창이 곧 사라질 가능성이 높음
    위처럼 참조를 유지하지 않으면 PyQt가 객체를 자동으로 제거합니다. 그러나 다음처럼 부모를 지정하거나 참조를 유지하면 창이 사라지지 않습니다:
def test2(self):
    dialog = QDialog(self)
    dialog.show()

추가 고려사항

  • 부모가 설정된 경우 자식 위젯은 부모가 보이거나 숨길 때 함께 영향을 받습니다.
  • QDialog와 같은 위젯은 부모를 설정하면 모달 대화상자로 동작할 수 있습니다.

결론

self를 사용하여 부모-자식 관계를 명시적으로 설정하면 메모리 관리 및 위젯 표시에서 이점을 얻을 수 있습니다. 또한, 클래스 속성으로 설정하여 다른 메서드에서 쉽게 접근할 수 있습니다. 반면, 특정한 경우에는 레이아웃을 통해 부모-자식 관계가 자동으로 설정되기도 합니다.

 

 

https://stackoverflow.com/questions/65152659/in-pyqt-why-somes-widgets-needs-the-self-parameter-before-calling-them-while

 

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