pyqt的gridlayout实现动态排列


业务场景

gridlayout不是固定的布局内容 内容数量也不固定 但是又要铺满整个布局 当内容数量变化的时候 需要重新计算每个item的宽高 使得尽量铺满整个布局 同时又要保证每个item的大小相同

def reLayoutSpectrum(self):
    # 设置可见性
    for i in range(self.channel_count):
        if i not in self.visible_leads:
            self.spectrumPlots[i][1].setVisible(False)
        else:
            self.spectrumPlots[i][1].setVisible(True)

    # 清空布局
    for i in reversed(range(self.spectrumLayout.count())):
        widget = self.spectrumLayout.itemAt(i).widget()
        self.spectrumLayout.removeWidget(widget)
        if widget is not None:
            widget.setParent(None)  # 从布局中移除

    # 把所有行和列的拉伸因子设置为0 清空!
    for row in range(self.spectrumLayout.rowCount()):
        self.spectrumLayout.setRowStretch(row, 0)
    for col in range(self.spectrumLayout.columnCount()):
        self.spectrumLayout.setColumnStretch(col, 0)

    rows, cols = self.calculateGrid()
            
    for index, plotIndex in enumerate(self.visible_leads):
        row = index // cols
        col = index % cols
        # 设置每个导联的高度
        self.spectrumLayout.addWidget(self.spectrumPlots[plotIndex][0], row, col)

    # 设置行和列的拉伸因子以确保所有行和列的高度和宽度相等
    for row in range(rows):
        self.spectrumLayout.setRowStretch(row, 1)
    for col in range(cols):
        self.spectrumLayout.setColumnStretch(col, 1)

文章作者: Lao Wu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lao Wu !
评论
  目录