如何重置QGridLayout中窗口小部件的列跨度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何重置QGridLayout中窗口小部件的列跨度?相关的知识,希望对你有一定的参考价值。

QLineEdit框添加到布局后,是否可以设置列跨度?我在QLineEdit有两个QGridLayout盒子,水平地彼此相邻。在执行我的一些代码期间,其中一个框被隐藏。我想增加隐藏的列跨度,以避免最后的奇怪间隙,并在需要时减少它。

除了在将小部件添加到布局之前进行调整之外,我在Qt文档中找不到任何关于此类更改的内容。

答案

添加小部件后,没有重置行或列跨度的方法。但是,可以在同一个窗口小部件上再次调用addWidget以实现相同的效果,因为将窗口小部件重新添加到同一布局总是会先隐式删除它。所以像这样的东西应该工作:

index = layout.indexOf(widget)
row, column = layout.getItemPosition(index)[:2]
layout.addWidget(widget, row, column, rowspan, colspan)

这是一个简单的演示脚本:

import sys
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtWidgets.QPushButton('Toggle Edit')
        self.button.clicked.connect(self.handleButton)
        self.edit1 = QtWidgets.QLineEdit()
        self.edit1.setPlaceholderText('One')
        self.edit2 = QtWidgets.QLineEdit()
        self.edit2.setPlaceholderText('Two')
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.edit1, 0, 0)
        layout.addWidget(self.edit2, 0, 1)
        layout.addWidget(self.button, 1, 0)

    def handleButton(self):
        if self.edit2.isHidden():
            self.setWidgetSpan(self.edit1, 1, 1)
            self.edit2.setHidden(False)
        else:
            self.edit2.setHidden(True)
            self.setWidgetSpan(self.edit1, 1, 2)

    def setWidgetSpan(self, widget, rowspan=1, colspan=1):
        layout = self.layout()
        index = layout.indexOf(widget)
        row, column = layout.getItemPosition(index)[:2]
        layout.addWidget(widget, row, column, rowspan, colspan)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 100)
    window.show()
    sys.exit(app.exec_())
另一答案

尝试如下所述。

当您添加两个QLineEdit时,QGridLayout会动态创建两列。

如果你想要额外的列用于跨越使用QSpacerItem并获得额外的列。而且你必须使用addItem(..,..,..)QGridLayout来将间隔项添加到布局中。

在您的两个QLineEdit之间添加垫片,如下所示

spacer =  QtGui.QSpacerItem(20, 20)
layout.addItem(spacer,0,1)

现在如果你添加totak 4个垫片(例如),

spacer1 =  QtGui.QSpacerItem(20, 20)
layout.addItem(spacer1,0,2)

spacer2 =  QtGui.QSpacerItem(20, 20)
layout.addItem(spacer2,0,3)

spacer3 =  QtGui.QSpacerItem(20, 20)
layout.addItem(spacer3,0,4)

现在你总共有6列-------第一个QLineEdit(第0列),4个垫片,最后一个QLineEdit(第5列)

现在,您可以使用setColumnStretch(column,stretch)设置任何行编辑的范围。在这里,我试图设置最后一个QLineEdit的跨度..如下所示。跨越3列......

layout.setColumnStretch(5,3) 

希望这可以帮助...

以上是关于如何重置QGridLayout中窗口小部件的列跨度?的主要内容,如果未能解决你的问题,请参考以下文章

使用与具有不同列数的另一个QGridLayout相同的列间距

如何从 QGridLayout 中的单元格中删除小部件

如何在 QGridLayout 中设置小部件的顺序

如何在 PyQt5 中为 QGridLayout 添加拉伸?

将小部件插入 QGridLayout 的问题

QGridLayout 限制中的多个小部件