Python 如何在QGridLayout中重置小部件的列跨度?

Python 如何在QGridLayout中重置小部件的列跨度?,python,pyqt,pyqt5,qgridlayout,columnspan,Python,Pyqt,Pyqt5,Qgridlayout,Columnspan,将QLineEdit框添加到布局后,是否可以设置其列跨度?我在QGridLayout中有两个QLineEdit框,它们在水平方向上紧挨着。在我的一些代码执行过程中,其中一个框被隐藏。我想增加隐藏的柱子跨度,以避免末端出现奇怪的缝隙,并在需要时减小 除了在将小部件添加到布局之前进行调整之外,我在Qt文档中找不到任何关于此类更改的内容。尝试如下所述 添加两个QLineEdit时,QGridLayout会动态创建两列 如果您需要额外的列来进行跨越,请使用QSpacerItem并获取额外的列。 您必须使

QLineEdit
框添加到布局后,是否可以设置其列跨度?我在
QGridLayout
中有两个
QLineEdit
框,它们在水平方向上紧挨着。在我的一些代码执行过程中,其中一个框被隐藏。我想增加隐藏的柱子跨度,以避免末端出现奇怪的缝隙,并在需要时减小

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

尝试如下所述

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

如果您需要额外的列来进行跨越,请使用
QSpacerItem
并获取额外的列。 您必须使用
QGridLayout
addItem(…,…,…)
将间隔项添加到布局中

在两个
QLineEdit
之间添加间隔符,如下所示

spacer =  QtGui.QSpacerItem(20, 20)
layout.addItem(spacer,0,1)
现在,如果添加totak 4垫片(例如)

现在您总共有6列------第一列是
QLineEdit
(列0),第四列是间隔符,最后一列是
QLineEdit
(列5)

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

layout.setColumnStretch(5,3) 

希望这有帮助…

在添加小部件后,没有重置行或列跨度的方法。但是,可以在同一个小部件上再次调用
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_())

我假设是这样,但我不知道重新添加它会产生预期的效果。在我的例子中,我使用了一个UI文件,其中有一些明显的变化,这是否也会产生相同的效果?@AaronTomason。应该可以-您只需要对小部件及其所在布局的引用。
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_())