使用objectName' _layout'

时间:2017-10-07 16:45:35

标签: qt pyqt qt5 pyqt5 qlayout

我正在探索Qt布局和小部件管理,并且遇到了我无法解释的行为。

我有一个具有以下层次结构的基本UI:

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

后来我向centralwidget添加了几个布局和小部件,但是,我相信,在这种情况下它并不重要。

现在,如果我们检查MainWindow的子对象及其objectNames,我们将看到以下内容:

<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事件添加了一个eventFilter,这是几个窗口调整大小后的对象地址:

<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

布局就在那里,但每次对象都是新的。

这里发生了什么?这个QLayout的目的是什么,以及它为什么会这样?

1 个答案:

答案 0 :(得分:2)

2165类有一个内置的自定义布局,可管理所有工具栏,菜单栏,停靠窗口小部件,状态栏和中央窗口小部件区域:

main-window-layout

此布局无法删除,或由其他布局替换。如果你试图这样做,Qt会抱怨(甚至可能会崩溃)。

QMainWindow中显示的对象ID并不意味着什么。这是布局的PyQt包装器的id,而不是底层C ++对象的内存地址。布局实际上是repr - 但这不是公共类型,因此PyQt只能返回QMainWindowLayout(这是它的基类)。每次访问时,PyQt都可能会在同一个底层C ++对象周围返回一个新的包装器。