如何删除动态生成的复选框?
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_())
所以我有一个 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_())