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

3
是否可以在将QLineEdit框添加到布局后设置其列跨度?我有两个QLineEdit框在水平方向上紧挨着。在我的一些代码执行期间,其中一个框被隐藏了。我想增加隐藏框所在的列跨度,以避免末尾出现奇怪的间隙,并在需要时减小它。
我在Qt文档中并没有找到这种类型更改的相关信息,除了在将小部件添加到布局之前进行调整。
2个回答

4

在添加小部件后,没有一种方法可以重置行或列跨度。但是,可以再次对同一小部件调用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 文件,并进行了一些明显的更改,这样做是否也会产生相同的效果? - artomason
1
@AaronTomason。它应该可以 - 您只需要引用小部件和其所在的布局即可。 - ekhumoro

0

请按照以下所述进行尝试。

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

如果您想要跨越使用QSpacerItem获得额外的列,则必须使用QGridLayoutaddItem(..,..,..)将间隔项添加到布局中。

在您的两个QLineEdit之间添加如下所示的间隔器

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

现在如果您添加了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) 

希望这能有所帮助...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接