使用 objectName '_layout' 自动添加 QLayout 的目的是什么

What's the purpose of auto added QLayout with objectName '_layout'

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

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

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

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

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

<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 不是持久的,偶尔会被添加和删除,例如在调整大小时。我为调整大小事件添加了一个 eventFilter,这里是几次 window 调整大小后的对象地址:

<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 的目的是什么,为什么它会这样?

QMainWindow class 具有管理所有工具栏、菜单栏、停靠小部件、状态栏和中央小部件区域的内置自定义布局:

无法删除此版式,也无法将其替换为其他版式。如果您尝试这样做,Qt 会报错(甚至可能崩溃)。

repr 中显示的对象 ID 意义不大。这是布局的 PyQt 包装器的 ID,而不是底层 C++ 对象的内存地址。布局实际上是一个 QMainWindowLayout - 但那不是 public 类型,所以 PyQt 只能 return 一个 QLayout (这是它的基础 - class) .每次您访问 PyQt 时,很可能 return 围绕同一个底层 C++ 对象创建一个新的包装器。