我在探索Qt布局和小部件管理,并遇到了我无法解释的行为。
我有一个具有以下层次结构的基本UI:
MainWindow(QMainWindow) ->
centralwidget (QWidget),
menubar(QMenuBar),
statusbar(QStatusBar)稍后,我向中心小部件添加了几个布局和小部件,但是,我想,在这个上下文中它并不重要。
现在,如果我们检查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不是持久化的,偶尔也会被添加和删除,例如调整大小。我为一个调整大小的事件添加了一个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的目的是什么,为什么它的行为是这样的?
发布于 2017-10-07 19:01:23
QMainWindow类有一个内置的自定义布局,它管理所有工具栏、菜单、坞小部件、statusbar和中央小部件区域:

不能移除此布局,也不能由其他布局替换。如果您尝试这样做,Qt会抱怨(甚至可能崩溃)。
repr中显示的对象id并不意味着什么。这是布局的PyQt包装器的id,而不是底层C++对象的内存地址。布局实际上是一个QMainWindowLayout,但这不是一个公共类型,因此PyQt只能返回一个QLayout (这是它的基类)。很可能PyQt每次访问它时都会围绕相同的底层C++对象返回一个新的包装器。
https://stackoverflow.com/questions/46622706
复制相似问题