如何让QDockWidget填满可用空间?为何无法并排放置多个停靠控件?
问题成因
- QMainWindow默认会将窗口缩放产生的额外空间优先分配给中心部件,你当前设置了一个无内容、无布局的空QWidget作为中心部件,窗口放大时这个空白部件会占用中间区域,导致两侧停靠窗内的绘图无法拉伸填充可用空间。
- 未显式配置停靠区域的拉伸权重,也未开启停靠嵌套优化,多停靠窗拆分排布时的空间分配逻辑不符合预期。
修复方案
修改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
相关产品推荐
相关产品推荐

