2017-10-07 92 views
1

我在研究Qt佈局和窗口小部件管理,並遇到了我無法解釋的行爲。自動添加QLayout的目的是什麼objectName'_layout'

我有以下層次結構中的基本UI:

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

後來我補充幾個佈局和小部件的centralwidget,但是,我beleive,這不是重要的在這方面。現在

,如果我們檢查主窗口的子對象及其對象名排序,我們將看到以下內容:

<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不是持久的,偶爾會被添加和刪除,例如調整大小。

<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 

佈局是存在的,但每一次的對象是新的:經過多次調整窗口大小我已經添加了resize事件的eventFilter,這裏是對象的地址。

這是怎麼回事嗎?這個QLayout的目的是什麼,以及它爲什麼這樣表現?

回答

2

QMainWindow類有管理所有的工具欄,菜單欄,停靠的小部件,狀態欄和中央按鈕區一個內置的自定義佈局:

main-window-layout

此佈局,則無法刪除或更換由不同的佈局。如果你試圖這樣做,Qt會抱怨(甚至可能崩潰)。

repr中顯示的對象ID沒有多大意義。這是用於佈局的PyQt包裝的ID,而不是底層C++對象的內存地址。佈局實際上是一個QMainWindowLayout - 但這不是一個公共類型,所以PyQt只能返回QLayout(這是它的基類)。 PyQt可能會在每次訪問它時在同一個基礎C++對象周圍返回一個新的包裝。

+0

謝謝你的解釋!你是對的,由於某種原因,PyQt圍繞相同的底層C++對象返回一個新的包裝。我搜索了一種獲取包裝對象地址的方法,並找到''''sip.unwrapinstance(obj)'''。它爲這些不同的Python包裝返回相同的地址。 – wombatonfire

相關問題