2017-10-07 16 views
1

Qt 레이아웃과 위젯 관리를 탐색하면서 설명 할 수없는 동작이 발생했습니다.자동 추가의 목적은 무엇입니까? objectName '_layout'이있는 QLayout

MainWindow(QMainWindow) -> 
    centralwidget (QWidget), 
    menubar(QMenuBar), 
    statusbar(QStatusBar) 

나중에 내가, 믿습니다은이 맥락에서 중요하지의 centralwidget에 여러 레이아웃과 위젯을 추가 할 수 있지만 :

나는 다음과 같은 계층 구조와 기본 UI가 있습니다.

이제 우리는 MainWindow를의 아이들을 선택하면 개체 및 ObjectName를 우리는 다음과 같은 표시됩니다

<PyQt5.QtWidgets.QLayout object at 0x00000000089425E8> _layout 
<PyQt5.QtWidgets.QWidget object at 0x00000000087C6F78> centralwidget 
<PyQt5.QtWidgets.QMenuBar object at 0x0000000008942048> menubar 
<PyQt5.QtWidgets.QStatusBar object at 0x00000000089420D8> statusbar 

어떤 이유로하는 QLayout 객체 _layout 나타납니다하십시오. 그러나 이것이 전부는 아닙니다. 이 QLayout은 영속적이지 않고 때로는 resize에 추가되거나 제거되는 것처럼 보입니다.

<PyQt5.QtWidgets.QLayout object at 0x0000000008942708> _layout 
<PyQt5.QtWidgets.QLayout object at 0x00000000089425E8> _layout 
<PyQt5.QtWidgets.QLayout object at 0x0000000008942798> _layout 
<PyQt5.QtWidgets.QLayout object at 0x00000000089428B8> _layout 

레이아웃이 있지만, 때마다 개체가 새로운 : 여러 창 크기를 조정 한 후에 나는 객체 주소는 여기에 크기 조정 이벤트에 대한 eventFilter을 추가하고있다.

여기 무슨 일 이니? 이 QLayout의 목적은 무엇이며 왜이 방식으로 작동합니까?

답변

2

QMainWindow 클래스의 모든 도구 모음, 메뉴 모음, 독 - 위젯, 상태 표시 및 중앙 위젯 영역 관리하는 내장 된 사용자 지정 레이아웃이 있습니다이 레이아웃은 제거하거나 대체 할 수없는

main-window-layout

을 다른 레이아웃으로 그렇게하려고하면 Qt가 불평 할 것입니다 (또는 심지어 충돌 할 수도 있습니다).

repr에 표시된 개체 ID는 그다지 의미하지 않습니다. 이것은 레이아웃을위한 PyQt 래퍼의 ID이며 기본 C++ 객체의 메모리 주소는 아닙니다. 레이아웃은 실제로 QMainWindowLayout입니다.하지만 public 유형은 아니므로 PyQt는 QLayout (기본 클래스) 만 반환 할 수 있습니다. PyQt가 액세스 할 때마다 같은 기본 C++ 객체에 새로운 래퍼를 반환 할 가능성이 있습니다.

+0

설명해 주셔서 감사합니다. 그리고 당신이 맞습니다, 어떤 이유로 PyQt는 동일한 기본 C++ 객체에 새로운 래퍼를 반환합니다. 랩된 객체의 주소를 얻는 방법을 찾고'''sip.unwrapinstance (obj)''를 찾았습니다. 이 다른 파이썬 래퍼에 대해 동일한 주소를 반환합니다. – wombatonfire