Skip to main content
 首页 » 编程设计

python之如何更改 QDockWidgetArea 中所有 QDockWidget 的宽度/高度

2025年05月04日22cloudgamer

我有一个 PyQt 4 应用程序,它有一个 QMainWindow,在左侧和底部停靠区域有停靠的 QDockWidgets。我目前有两个小部件停靠在左侧,两个小部件停靠在底部。我正在尝试弄清楚如何以编程方式移动中央小部件和停靠区域之间的边界,从而有效地更改停靠区域的宽度(对于左侧或右侧区域)或高度(对于顶部和底部停靠区域).

我可以用鼠标手动完成;当我将光标移到中央小部件和停靠区域之间的边界上时,我得到一个调整大小的 handle ,我可以使用它来拉伸(stretch)停靠区域。我还没有找到一个接口(interface)来让我从我的程序中做到这一点。我已经尝试手动调整 QDockWidget 对象本身(文档建议反对)和它们包装的小部件(应该工作)的大小,但这似乎不起作用。有什么想法吗?

具体来说,这种方法行不通:

dock1.resize(QSize(width, height)) 
dock2.resize(QSize(width, height)) 
dock3.resize(QSize(width, height)) 

这也不行:

dock1.widget().resize(QSize(width, height)) 
dock2.widget().resize(QSize(width, height)) 
dock3.widget().resize(QSize(width, height)) 

请您参考如下方法:

我想我明白发生了什么。首先是文档中的一些注释。

第一个QMainWindow :

QMainWindow has its own layout to which you can add QToolBars, QDockWidgets, a QMenuBar, and a QStatusBar. The layout has a center area that can be occupied by any kind of widget.

QMainWindow 有自己的布局管理器,这意味着它将管理其项目的布局。我在文档中找不到任何引用,但我猜布局管理器试图最大化 centralWidget 的区域。因此,所有其他元素都缩小到最低限度。

让我们看看QDockWidget :

A QDockWidget acts as a wrapper for its child widget, set with setWidget(). Custom size hints, minimum and maximum sizes and size policies should be implemented in the child widget. QDockWidget will respect them, adjusting its own constraints to include the frame and title. Size constraints should not be set on the QDockWidget itself, because they change depending on whether it is docked; a docked QDockWidget has no frame and a smaller title bar.

所以这意味着您应该在 QDockWidget 中更改小部件的大小。当 QDockWidget float 时,它可以根据其小部件的要求自由调整大小。但是停靠它会将它留给 QMainWindow 的布局管理器,它会缩小。

可能最简单的解决方案是为 QDockWidget 中的小部件设置 minimumSize,这样 QMainWindow 中的布局管理器就不会将其缩小到超出此范围.或者,您可以为小部件子类化并重新实现 sizeHint 方法,以便布局管理器获得首选大小。

简而言之,这应该有效:

dock1.widget().setMinimumSize(QSize(width, height)) 
dock2.widget().setMinimumSize(QSize(width, height)) 
dock3.widget().setMinimumSize(QSize(width, height))