PyQtGraph设置rowspan后PlotWidget高度异常,如何解决?
问题:Pyqtgraph LayoutWidget中rowspan设置不生效,顶部PlotWidget反而最短
我想要设置三个PlotWidget组件:wgt_simplePlot0、wgt_simplePlot1、wgt_simplePlot2。希望wgt_simplePlot0位于顶部,通过rowspan参数将其设置为另外两个组件的15倍高度,但运行脚本后,wgt_simplePlot0反而成为最短的组件。请问问题出在哪里?
环境信息
- Windows 10
- Python 3.9 x64
- Pyqtgraph 0.12.4/0.13.3
代码示例
import pyqtgraph as pg from pyqtgraph import PlotWidget from pyqtgraph.Qt import QtCore, QtWidgets class PlotterWin: def __init__(self): self.app = pg.mkQApp() self.win = QtWidgets.QMainWindow() gridLayout = pg.LayoutWidget() self.wgt_simplePlot0 = PlotWidget(background='white') gridLayout.addWidget(self.wgt_simplePlot0, row=0, col=0, rowspan=15, colspan=10 ) self.wgt_simplePlot1 = PlotWidget(background='white') gridLayout.addWidget(self.wgt_simplePlot1, row=16, col=0, rowspan=1, colspan=5 ) self.wgt_simplePlot2 = PlotWidget(background='white') gridLayout.addWidget(self.wgt_simplePlot2, row=16, col=5, rowspan=1, colspan=5 ) self.win.setCentralWidget(gridLayout) self.win.show() if __name__ == "__main__": plotter = PlotterWin()
问题原因
Pyqtgraph的LayoutWidget默认不会根据rowspan数值自动按比例分配行高,它会优先依据组件的sizeHint(默认最小尺寸)分配空间。你设置wgt_simplePlot0的rowspan=15,但row1到row15都是空行,这些空行默认没有高度;而row16因为包含两个PlotWidget,会被分配更多空间,最终导致顶部的wgt_simplePlot0反而成为最短的组件。
解决方法
通过LayoutWidget.setRowStretch()方法给对应行设置拉伸因子,明确指定行高比例:
- 给wgt_simplePlot0所在的row0设置拉伸因子15
- 给wgt_simplePlot1、wgt_simplePlot2所在的row16设置拉伸因子1
修改后的代码如下:
import pyqtgraph as pg from pyqtgraph import PlotWidget from pyqtgraph.Qt import QtCore, QtWidgets class PlotterWin: def __init__(self): self.app = pg.mkQApp() self.win = QtWidgets.QMainWindow() gridLayout = pg.LayoutWidget() self.wgt_simplePlot0 = PlotWidget(background='white') gridLayout.addWidget(self.wgt_simplePlot0, row=0, col=0, rowspan=15, colspan=10 ) # 设置行拉伸因子,按比例分配高度 gridLayout.setRowStretch(0, 15) self.wgt_simplePlot1 = PlotWidget(background='white') gridLayout.addWidget(self.wgt_simplePlot1, row=16, col=0, rowspan=1, colspan=5 ) self.wgt_simplePlot2 = PlotWidget(background='white') gridLayout.addWidget(self.wgt_simplePlot2, row=16, col=5, rowspan=1, colspan=5 ) # 设置第二行的拉伸因子 gridLayout.setRowStretch(16, 1) self.win.setCentralWidget(gridLayout) self.win.show() if __name__ == "__main__": plotter = PlotterWin() pg.exec()
另外注意,原代码缺少pg.exec()启动事件循环,添加后才能正常运行窗口。
内容的提问来源于stack exchange,提问作者maynull
相关产品推荐
相关产品推荐

