【问题标题】:How to remove dynamically generated checkboxes?如何删除动态生成的复选框?
【发布时间】:2021-04-27 04:23:59
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 确实如此。只需创建一个列表作为实例属性,如self.checkboxes = [],然后checkBox = QCheckBox(x); self.checkboxes.append(checkBox)
  • @musicamante 嗯,老实说,这让我有点困惑,所以在你的示例中,复选框是我从 json 文件名生成的标签列表,但让我感到困惑的是为什么我们将复选框附加到复选框?您的示例中的 checkBox 不是 pyqt 中复选框的对象吗?
  • 没有。 checkboxes 是一个空列表,您可以在创建时将所有复选框添加到其中。如果要连接文件名,请创建一个字典,其中文件名作为键,复选框实例作为值(并且始终记住在删除复选框时删除键/值对!)。也就是说,这完全取决于您的程序的逻辑。例如,如果您有很长的文件列表,您可能更喜欢使用模型视图模式:对于这样的用法,QListWidget 可能是更好的选择。
  • 哦等等我明白了!我们正在附加一个新的对象列表,这些对象是复选框对象!完美的!我想我很好,谢谢!

标签: python python-3.x user-interface pyqt pyqt5


【解决方案1】:

要存储小部件以便以后可以访问它们,请创建一些容器,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_())

【讨论】:

    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多