如何在移除所有DockWidgets后调整QMainWindow大小?

6 投票
2 回答
2687 浏览
提问于 2025-04-16 23:25

我正在尝试制作一个应用程序,里面有一个 QMainWindow,它的中央部件是一个 QToolBar(虽然这可能不太常见,但这个工具栏非常适合我的需求)。我只允许在下面放置停靠窗口。我添加了一个 QDockWidget,并且在 QToolBar 上有一个 QAction,可以通过 removeDockWidget()restoreDockWidget() 来切换这个 QDockWidget 的显示和隐藏。

默认情况下,QMainWindow 的大小是 800 x 24,而 QToolBarmaximumHeight 也设置为 24。当我调用 removeDockWidget() 后,QMainWindow 的几何形状会通过 setGeometry() 被设置回 (0,0,800,24)

我想要实现的是,当 DockWidget 被移除时,QMainWindow 的高度也调整为 24。虽然 setGeometry() 似乎有效,因为宽度和位置都相应改变,但有趣的是,高度却没有变化。这就是我遇到的问题 :)

你觉得问题出在哪里呢?

这里有一个屏幕录制,展示了我遇到的问题。

补充说明:如果我用 QWidget 而不是 QMainWindow 来创建相同的场景,并在子部件上使用 show()hide(),那么我可以毫无问题地用 adjustSize() 来调整父部件的大小:看起来上面提到的问题是特定于 QMainWindow 的。

2 个回答

1

看起来你对 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()
2

选项

a) 你可以重写一个叫做 sizeHint() 的虚函数,让它返回你想要的主窗口大小。

b) 在主窗口的构造函数里,你可以依次调用 setMinimumSize() 和 setMaximumSize(),都传入你想要的主窗口大小。如果两个大小设置得一样,你就得到了一个固定的窗口大小。

c) 可以看看 layout()->setResizeMode(Fixed) 这个设置。

撰写回答