Python 删除所有DockWidget后如何调整QMainWindow的大小?

Python 删除所有DockWidget后如何调整QMainWindow的大小?,python,qt4,pyqt,qmainwindow,qdockwidget,Python,Qt4,Pyqt,Qmainwindow,Qdockwidget,我正在尝试制作一个由QMainWindow组成的应用程序,其中心部件是QToolBar(这可能不常见,但对于我来说,工具栏非常适合)。码头只允许在下面。我向它添加了一个QDockWidget,在QToolBar上的QAction通过removeDockWidget()和restoreDockWidget()切换QDockWidget的开关 QMainWindow的默认大小为800乘24,QToolBar的最大高度也设置为24。调用removeDockWidget()后,使用setGeometry

我正在尝试制作一个由
QMainWindow
组成的应用程序,其中心部件是
QToolBar
(这可能不常见,但对于我来说,工具栏非常适合)。码头只允许在下面。我向它添加了一个
QDockWidget
,在
QToolBar
上的
QAction
通过
removeDockWidget()
restoreDockWidget()
切换
QDockWidget
的开关

QMainWindow
的默认大小为800乘24,
QToolBar
最大高度也设置为24。调用
removeDockWidget()
后,使用
setGeometry()
QMainWindow
的几何图形设置回
(0,0800,24)

我想要实现的是在删除
DockWidget
时将
QMainWindow
的高度调整为24。
setGeometry()。这就是我的问题:)

你怎么想的

说明眼前的问题

注意:如果我使用QWidget而不是QMainWindow创建相同的场景,并在子窗口小部件上使用
show()
hide()
,那么我可以使用
adjustSize()
调整父窗口的大小,没有问题:上面的问题似乎是QMainWindow特有的。

选项

a) 可以将sizeHint()重载为虚拟函数。让它返回主窗口所需的大小

b) 在主窗口的构造函数中,可以依次调用setMinimumSize()和setMaximumSize(),这两个函数都具有所需的主窗口大小。如果两者保持不变,就可以得到一个固定的尺寸


c) 看看layout()->setResizeMode(Fixed)。

看起来您误解了
QMainWindow.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()

你能给出你代码的链接吗?您使用的是哪个版本的Qt?谢谢。我不太明白你的解释。我曾尝试使用updateGeometry()更改QmainWindow的几何图形,但实际效果不佳。我把上面的代码和输出放在这里,告诉你我的意思。检查我的答案,看看它是否有意义:)@Benjamin。。。您是否尝试过重载sizeHint或调用setMinimumSize()和setMaximumSize()?如果是的话,那么你得到了你想要的尺寸了吗?让我再试一次:我想我在某个地方搞砸了,得出了我以前的结论。好的,我试过:
self.setMaximumSize(self.centralWidget().geometry().height(),self.centralWidget().geometry().width())self.setGeometry(self.centralWidget().geometry())
认为应该告诉QMainWindow将其大小设置为最大值以下,在本例中为centralWidget的大小。我还尝试提供显式整数,例如
setMaximumSize(45800)
,但尽管它会影响宽度,但QMainWindow的高度不会低于75px。我犯下的关于
sizeHint()的错误确实是正确的
。但正如我刚才在回答中解释的那样:几何体仅适用于客户端区域,并且当移除基座时,帧区域不会受到影响。因此设置新几何体是不够的,即使是
adjustSize()
也无法更改帧大小。如果您有任何更改帧大小的Qt解决方案,请务必让我知道:)