如何重置 QGridLayout 中小部件的列跨度?
How to reset the column span of a widget in a QGridLayout?
是否可以在 QLineEdit
框添加到布局后设置其列跨度?我在 QGridLayout
中有两个水平相邻的 QLineEdit
框。在执行我的一些代码期间,这些框之一被隐藏了。我想增加隐藏的列跨度以避免最后出现奇怪的间隙,并在需要时减少它。
除了在将小部件添加到布局之前进行调整之外,我在 Qt 文档中找不到关于此类更改的任何内容。
按照下面的方法尝试。
当您添加两个 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)
希望这对您有所帮助...
添加小部件后,没有重置行跨度或列跨度的方法。但是,可以在同一个小部件上再次调用 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
中有两个水平相邻的 QLineEdit
框。在执行我的一些代码期间,这些框之一被隐藏了。我想增加隐藏的列跨度以避免最后出现奇怪的间隙,并在需要时减少它。
除了在将小部件添加到布局之前进行调整之外,我在 Qt 文档中找不到关于此类更改的任何内容。
按照下面的方法尝试。
当您添加两个 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)
希望这对您有所帮助...
添加小部件后,没有重置行跨度或列跨度的方法。但是,可以在同一个小部件上再次调用 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_())