You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让QDockWidget填满可用空间?为何无法并排放置多个停靠控件?

问题成因

  1. QMainWindow默认会将窗口缩放产生的额外空间优先分配给中心部件,你当前设置了一个无内容、无布局的空QWidget作为中心部件,窗口放大时这个空白部件会占用中间区域,导致两侧停靠窗内的绘图无法拉伸填充可用空间。
  2. 未显式配置停靠区域的拉伸权重,也未开启停靠嵌套优化,多停靠窗拆分排布时的空间分配逻辑不符合预期。

修复方案

修改PlotWindow类的初始化配置,移除空中心部件的空间占用,调整停靠区域的拉伸策略即可,修改后的完整代码如下:

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from PyQt5 import QtWidgets, QtCore
import traceback
import logging


def exception_hook(exc_type, exc_value, exc_tb):
    tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
    logging.error('\n' + tb)
    QtWidgets.QApplication.quit()


class PlotWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(PlotWindow, self).__init__(parent=parent)
        self.setWindowTitle('plot window')
        self.setCentralWidget(QtWidgets.QWidget(self))
        # 新增配置开始
        self.centralWidget().hide() # 隐藏无用的空中心部件,避免其占用布局空间
        self.setDockNestingEnabled(True) # 开启停靠嵌套支持,优化多停靠窗排布逻辑
        # 给左右停靠区域设置相同的拉伸权重,缩放时空间会按比例分配给停靠区域
        self.setDockStretch(QtCore.Qt.LeftDockWidgetArea, 1)
        self.setDockStretch(QtCore.Qt.RightDockWidgetArea, 1)
        # 新增配置结束

    def add_figure(self, figure):
        mplCanvas = FigureCanvas(figure)
        mplCanvas.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        dockableMplCanvas = QtWidgets.QDockWidget(self)
        dockableMplCanvas.setWidget(mplCanvas)
        # 可选:设置停靠窗允许停靠的区域,可根据需求调整
        dockableMplCanvas.setAllowedAreas(QtCore.Qt.AllDockWidgetAreas)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dockableMplCanvas)


if __name__ == '__main__':
    import sys

    logging.basicConfig(level=logging.DEBUG)
    logging.getLogger('matplotlib').setLevel(logging.ERROR)
    sys.excepthook = exception_hook

    app = QtWidgets.QApplication(sys.argv)

    pw = PlotWindow()

    for _ in range(4):
        fig = Figure(tight_layout=True)
        ax = fig.add_subplot()
        pw.add_figure(fig)

    pw.show()

    exit(app.exec_())

修改后即可实现停靠窗拖拽排布后,窗口缩放时绘图自动拉伸填充全部可用空间的效果。

内容的提问来源于stack exchange,提问作者user9413641

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:09:00