如何从Python中使用PyQt创建的GUI的垂直布局中删除任何布局

问题描述 投票:0回答:1

我想要一个动态 GUI,可以在其中添加或删除任何布局。因此,为了在 GUI 中添加布局,我使用临时变量并将它们添加到布局中。现在,当我想从中间删除任何布局并在中间添加布局时。我该怎么办。

图片:

enter image description here

在此图像中,每一行都是垂直布局中的一个水平布局。我想使用十字符号从中删除布局,并使用加号按钮添加布局。我想添加任意数量的布局和删除任意数量的布局。我该怎么办。

    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.
python pyqt pyqt5
1个回答
0
投票

您需要获得一个动态引用,以允许您识别垂直布局中按下的按钮的行。

一种可能是创建所有删除按钮的列表,并使用 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()
© www.soinside.com 2019 - 2024. All rights reserved.