2017-10-07 60 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

相关问题