2017-05-21 1 views
2

위젯을 PyQt5 응용 프로그램에 추가 할 때 이상한 문제가 있습니다.PyQt 위젯이 부모를 "잊어 버린 것 같습니다"

class OllRoot(preferences.Group): 
    """Basic openLilyLib installation""" 
    def __init__(self, page): 
     super(OllRoot, self).__init__(page) 
     self.setParent(page) 
     self.changedRoot() 

     layout = QGridLayout() 
     self.setLayout(layout) 

     self.directory = widgets.urlrequester.UrlRequester() 
     self.directory.changed.connect(self.changedRoot) 

     layout.addWidget(self.directory, 0, 1) 

    def changedRoot(self): 
     print("Self:", self) 
     print("Parent:", self.parent()) 
     self.parent().changed.emit() 
     # TODO: Check for proper openLilyLib installation 
생성자가 호출

, parent()가 제대로 전달 된 객체로 설정됩니다

다음 (translateUI 등) 관련 없어 보이는 모든 것을 벗겨 실제 코드입니다 안에는 page으로 표시되므로 두 개의 적절한 객체가 인쇄됩니다.

Self: <preferences.openlilylib.OllRoot object at 0x7f855a1de288> 
Parent: <PyQt5.QtWidgets.QWidget object at 0x7f855a1dbc18> 

질문 : (내가 그것을 연결 한대로)를 다시 호출되는 self.directory 위젯 changedRoot의 변경을 할 때

Self: <preferences.openlilylib.OllRoot object at 0x7f855a1de288> 
Parent: <preferences.openlilylib.OpenLilyLibPrefs object at 0x7f855a1bcb88> 

그러나,하지만 지금은 부모가 사라진 것 같습니다 :

  • setParent에 문제가 있습니까?
  • connect에 문제가 있습니까?
  • 개체가 어떻게 든 부모를 "잊어 버렸습니까?"

추신 : 모델로 제공되는 유사한 파일은 https://github.com/wbsoft/frescobaldi/blob/master/frescobaldi_app/preferences/general.py#L56에서 찾을 수 있습니다.

답변

2

위젯이 레이아웃에 추가 될 때마다 Qt는 레이아웃을 위젯에 배치하기 위해 자동으로 위젯을 다시 부모로 만듭니다. __init__setParent (다른 위젯 사용)을 호출해도 지속적인 효과가 없습니다.

+0

설명해 주셔서 감사합니다. 나는'__init__' 메소드에 새로운'page' 속성을 추가하여 상황을 해결했습니다. Qt의 처리에 의해 하이재킹되지 않습니다. –

관련 문제