我想要一个动态 GUI,可以在其中添加或删除任何布局。因此,为了在 GUI 中添加布局,我使用临时变量并将它们添加到布局中。现在,当我想从中间删除任何布局并在中间添加布局时。我该怎么办。
图片:
在此图像中,每一行都是垂直布局中的一个水平布局。我想使用十字符号从中删除布局,并使用加号按钮添加布局。我想添加任意数量的布局和删除任意数量的布局。我该怎么办。
row = QHBoxLayout()
checkbox = QCheckBox()
line = QLineEdit()
line.setFixedSize(220,30)
browse = QPushButton()
browse.clicked.connect(self.browse_file)
browse.setFixedSize(30,30)
browse.setIcon(QIcon(os.path.join(os.getcwd(),"open-folder-with-document.png")))
text_editor = QPushButton()
text_editor.setFixedSize(30,30)
text_editor.setIcon(QIcon(os.path.join(os.getcwd(),"text_edit.png")))
modify_block = QPushButton()
modify_block.setFixedSize(30,30)
modify_block.setIcon(QIcon(os.path.join(os.getcwd(),"Modify_block.png")))
delete_button = QPushButton()
delete_button.setFixedSize(30,30)
delete_button .setIcon(QIcon(os.path.join(os.getcwd(),"delete.png")))
plus_button = QPushButton()
plus_button.setFixedSize(30,30)
plus_button.setIcon(QIcon(os.path.join(os.getcwd(),"Plus.png")))
row.addWidget(checkbox)
row.addWidget(line)
row.addWidget(browse)
row.addWidget(text_editor)
row.addWidget(modify_block)
row.addWidget(delete_button)
row.addWidget(plus_button)
self.elements.addLayout(row)
'''
I am using this code to add layout. I tried to create layout and element as a part of class using self and global variable but I don't know maximum number of horizontal layout. it can me 300-350 layout.
您需要获得一个动态引用,以允许您识别垂直布局中按下的按钮的行。
一种可能是创建所有删除按钮的列表,并使用 lambda(或部分)或使用
sender()
: 连接它们的信号
self.deleteButtons = []
def addRow(self):
# your code as above
...
self.deleteButtons.append(delete_button)
delete_button.clicked.connect(self.deleteRowFromButton)
def deleteRowFromButton(self):
button = self.sender()
index = self.deleteButtons.index(button)
hbox = self.elements.itemAt(index).layout()
while hbox.count():
item = hbox.itemAt(0)
if item.widget():
widget = item.widget()
hbox.removeWidget(widget)
widget.deleteLater()
self.deleteButtons.remove(button)
请注意,只有当
self.elements
仅添加了如上所示的小部件/布局时,上述方法才有效:如果添加其他元素,则上面检索到的 index
显然会不一致。
考虑在这些情况下,更好的方法是将 QWidget 子类中每行的小部件“分组”,这允许更好的模块化并通过自定义信号提供更一致的管理:
class ElementRow(QWidget):
deleteRequest = pyqtSignal(object)
def __init__(self):
super().__init__()
layout = QHBoxLayout(self)
self.checkBox = QCheckBox()
... create all items and add them to the layout
self.delete_button.clicked.connect(lambda:
self.deleteRequest.emit(self))
然后,在主类中,您可以执行以下操作:
def addRow(self):
row = ElementRow()
self.elements.addWidget(row)
row.deleteRequest.connect(self.deleteRow)
def deleteRow(self, element):
self.elements.removeWidget(element)
element.deleteLater()