如何删除动态生成的复选框?

How to remove dynamically generated checkboxes?

所以我有一个 pyqt5 GUI,它根据保存在目录中的 JSON 文件的标题生成复选框。我的下一步是让它在用户选中一个框时删除该复选框,然后删除 JSON 文件。

目前我生成的复选框如下:

        for x in self.list:
            layout.addWidget(QCheckBox(x),row,0)
            row+=1

由于我没有将每个复选框分配给 object,我将如何检查每个复选框的状态,然后为其分配一个操作?

因为我正在学习讨论我的想法:

我希望我可以使用 Signals 来检测信号何时从整个小部件传输,然后使用删除目录中共享生成的 object 名称的任何文件的函数插入它信号。

还有没有更好的方法来生成复选框?

要存储小部件以便稍后您可以访问它们,请创建一些容器,List 会做得很好:

self.checkboxes = []
...
checkbox = QCheckBox("Iam checkbox number: {}".format(len(self.checkboxes))) #Create checkbox
 
self.vbox.addWidget(checkbox) #Add it to layout
self.checkboxes.append(checkbox) #Store it for later use in List

要删除它们,您可以使用 .deleteAfter() 方法:

self.checkboxes[-1].deleteLater() #[-1] gives us the last element and .deleteLater() gets rid of the widget GUI wise.
self.checkboxes.pop() #Then we just remove the last element from the list so it doesn't take space

这是整个工作示例:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QCheckBox, QVBoxLayout

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.width = 320
        self.height = 200
        self.initUI()
    
    def initUI(self):
        self.setWindowTitle("My app")
        
        self.vbox = QVBoxLayout()
        self.vbox.addStretch(1)

        cr_button = QPushButton('Press to add widgets')
        cr_button.clicked.connect(self.create)

        del_button = QPushButton('Press to delete widgets')
        del_button.clicked.connect(self.delete)

        self.vbox.addWidget(cr_button)
        self.vbox.addWidget(del_button)

        self.checkboxes = []

        self.setLayout(self.vbox)
        self.show()

    def create(self):
        checkbox = QCheckBox("Iam checkbox number: {}".format(len(self.checkboxes)))

        self.vbox.addWidget(checkbox)

        self.checkboxes.append(checkbox)
        self.show()

    def delete(self):
        self.checkboxes[-1].deleteLater()
        self.checkboxes.pop()
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())