如何在移除所有DockWidgets后调整QMainWindow大小?
我正在尝试制作一个应用程序,里面有一个 QMainWindow
,它的中央部件是一个 QToolBar
(虽然这可能不太常见,但这个工具栏非常适合我的需求)。我只允许在下面放置停靠窗口。我添加了一个 QDockWidget
,并且在 QToolBar
上有一个 QAction
,可以通过 removeDockWidget()
和 restoreDockWidget()
来切换这个 QDockWidget
的显示和隐藏。
默认情况下,QMainWindow
的大小是 800 x 24,而 QToolBar
的 maximumHeight
也设置为 24。当我调用 removeDockWidget()
后,QMainWindow
的几何形状会通过 setGeometry()
被设置回 (0,0,800,24)
。
我想要实现的是,当 DockWidget
被移除时,QMainWindow
的高度也调整为 24。虽然 setGeometry()
似乎有效,因为宽度和位置都相应改变,但有趣的是,高度却没有变化。这就是我遇到的问题 :)
你觉得问题出在哪里呢?
这里有一个屏幕录制,展示了我遇到的问题。
补充说明:如果我用 QWidget
而不是 QMainWindow
来创建相同的场景,并在子部件上使用 show()
或 hide()
,那么我可以毫无问题地用 adjustSize()
来调整父部件的大小:看起来上面提到的问题是特定于 QMainWindow
的。
2 个回答
看起来你对 QMainWindow.sizeHint()
这个方法的意思有些误解。
根据 QWidget.sizeHint()
的说明(QMainWindow
是从这个类继承来的):
这个属性表示的是这个小部件的推荐大小。
如果这个属性的值是一个无效的大小,就表示没有推荐的大小。默认情况下,如果这个小部件没有布局,
sizeHint()
方法会返回一个无效的大小;如果有布局的话,则返回布局的推荐大小。
如果你想获取窗口的实际大小,应该使用 QMainWindow.geometry()
方法,这个方法会提供关于小部件大小和位置的所有信息:
win_geo = self.geometry()
win_top = win_geo.top()
win_bottom = win_geo.bottom()
win_left = win_geo.left()
win_right = win_geo.right()
win_width = win_geo.width()
win_height = win_geo.height()
选项
a) 你可以重写一个叫做 sizeHint() 的虚函数,让它返回你想要的主窗口大小。
b) 在主窗口的构造函数里,你可以依次调用 setMinimumSize() 和 setMaximumSize(),都传入你想要的主窗口大小。如果两个大小设置得一样,你就得到了一个固定的窗口大小。
c) 可以看看 layout()->setResizeMode(Fixed) 这个设置。