2014-09-16 3 views
2

나는 온라인 어디에서나이 문제에 관해 많은 안내를 찾을 수 없을 것 같습니다. 나는 PySide를 배웠고 거기에있는 예제의 절반 만이 QStuff의 parentNone으로 설정하고 다른 예제는 그것을 객체로 설정합니다. 게임 중에 쓰레기 수거 문제가있을 수 있음을 알고 있습니다. QWidget 객체가 있고 QWidget으로 설정된 parent으로 QThing을 만들고 참조한 다음 QWidget에 QThing을 입력하면 .add이됩니다. 어딘가에 순환 참조가 있어야하는 것 같습니다. 파이썬은 참조 횟수를 계산하므로 개체가 가비지 수집되지 않습니다. (나는이 사건이 PySide에 의해 처리됩니다 생각하지만.)PySide에서 parent를 설정할 때

self.addWidget(QLabel('label', self))

같은 무언가조차 순환 참조가 발생할 것 어쩌면 내가 너무 많이 걱정하고 있는데이 모든 처리, 나도 몰라.

짧게 : PySide에서 부모를 사용하는 올바른 방법은 무엇입니까? 여기에 직장에서

+1

(C)가 정확하게 파이썬 이유로, 플러스 ** ** 가비지 컬렉션 참조 카운트를 사용한다. 따라서 circular-referencer는 대부분 (특히 python3.4 +에서)별로 중요하지 않습니다. – Bakuriu

답변

3

두 가지 :

Qt는

Qt는이 부모 관계를 통해 개체 나무의 객체를 구성합니다. 당신이 물체를 처분 할 때 모든 아이들은 (C면에서) 너무 파괴됩니다. 스타일과 같은 속성 또한이 관계를 통해 상속됩니다. 이것은 GUI 객체에 매우 유용하다는 것이 밝혀졌습니다. 대화 상자를 닫을 때 대화 상자의 버튼을 없애고 싶을 수도 있습니다.

은 자동으로 범위를 벗어날 떨어질 때

파이썬은 객체를 삭제도 Object Trees & Ownership

파이썬 (CPython과)를 참조하십시오. 예를 들어, 파이썬 가비지가 이미 그것을 수집했기 때문에 사라 졌다고 생각한 단추. 부모님을 도처에 올바르게 설정하는 것이 도움이된다는 것을 알았습니다. 예를 들어 레이아웃을 사용할 때 가장 쉬운 방법은 레이아웃 구성에 직접 부모를 지정하는 것입니다 (호출을 setLayout에 저장).

하지만 여전히 버튼에 대한 파이썬 참조가 있지만 위젯이 Qt에 의해 파괴 된 경우 "RuntimeError : Internal C++ 객체가 이미 삭제되었습니다."가 표시 될 수 있습니다.

부모님을 충분히 설치하면 Qt와 Python에서 버그없는 코드를 작성하는 데 많은 도움이됩니다. 당신의 예에서

은 :

self.addWidget(QLabel('label', self)) 

부모가 연이어 두 번 설정됩니다. 먼저 QLabel('label', self) 내부가 생성되고 addWidget이 호출 될 때 두 번째가됩니다 (QLayout의 설명서 참조). 같은 일을 두 번하는 대신, 한 번만하는 것이 아닙니다.

self.addWidget(QLabel('label')) 

그리고 자체 순환 참조 용

참조 Should I worry about circular references in Python?

+0

감사합니다. 그것은 대단한 대답이었습니다.그래서 나는'addWidget'이 그것의 일을하고 실제로 필요한 경우에만 부모를 추가하는 것을 선호해야한다고 생각합니다. 이것은 약간의 이상한 오류도 피할 수 있습니다. 나는'QTabWidget'의 각 탭의 부모를 설정했지만'addTab'을 호출하지 않는다면 탭을 위젯의 위에 모두 한꺼번에 그려 낼 것입니다. 하나의 탭에서만'addTab'을 호출하면 정말 펑키합니다. 그런 다음 추가되지 않은 탭과 중복 된 추가 탭을 그립니다 (이것은 버그 일 수 있습니다 ... 나는 1.1.0을 사용하고 있다고 생각합니다). 따라서'addWidget'과'addTab'를 고수하면 조금 더 안전 해 보입니다. –

+1

@CoryB 예. 부모 설정은 addXXX를 호출 할 때 대부분 자동으로 수행됩니다. 그냥 그 일을 시키십시오. 항상 레이아웃을 사용하십시오. 그렇게하면 결코 위젯을 서로 위에 그려 넣을 수 없습니다. – Trilarion

관련 문제