【问题标题】:How to reset the column span of a widget in a QGridLayout?如何在 QGridLayout 中重置小部件的列跨度?
【发布时间】:2018-05-30 02:37:52
【问题描述】:

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

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

【问题讨论】:

    标签: python pyqt pyqt5 qgridlayout columnspan


    【解决方案1】:

    在添加小部件后,无法重置行跨度或列跨度。但是,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。它应该这样做 - 您只需要对小部件及其所在布局的引用。
    【解决方案2】:

    尝试如下所述。

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

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

    在您的两个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) 
    

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2017-03-02
      • 2020-12-28
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多