【问题标题】:Delete Label and Button on Button Click PyQt5删除按钮上的标签和按钮单击PyQt5
【发布时间】:2021-10-07 18:32:03
【问题描述】:

我正在编写一个程序,其中有一个显示当前任务的列表。简化版如下所示:

然后我单击添加按钮,它将任务附加到另一个任务,然后单击 X,它必须删除任务。 我在编程方面不是那么先进,无法弄清楚如何正确地做到这一点。代码如下所示:

import sys
from PyQt5.QtWidgets import (
    QApplication,
    QGridLayout,
    QLineEdit,
    QPushButton,
    QVBoxLayout,
    QWidget,
    QLabel)


class App(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.taskList = ['Some text 1', 'Some text 2', 'some text 3']

        self.initUI()

    def initUI(self):
        self.title = 'Task list'
        self.main_layout = QVBoxLayout()
        self.grid = QGridLayout()
        self.input_field = QLineEdit()
        self.add = QPushButton('add')
        self.add.clicked.connect(self.addTask)
        self.grid.addWidget(self.input_field, 0, 0)
        self.grid.addWidget(self.add, 0, 1)

        self.showTasks()

        self.main_layout.addLayout(self.grid)
        self.main_layout.addStretch()

        self.setLayout(self.main_layout)
        self.setWindowTitle(self.title)
        self.resize(300, 100)
        self.show()

    def showTasks(self):
        row = 2
        col = 0
        for task in self.taskList:
            task_label = QLabel(task)
            task_button = QPushButton('X')
            task_button.clicked.connect(
                lambda: self.removeTask(task_label.text()))
            self.grid.addWidget(task_label, row, col, 1, 1)
            self.grid.addWidget(task_button, row, col+1, 1, 1)
            row += 1

    def addTask(self):
        task = self.input_field.text()
        if task:
            self.taskList.append(task)
        self.update()

    def removeTask(self, task):
        self.taskList.remove(task)
        self.update()


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

【问题讨论】:

  • 您的list taskList 是如何连接到 UI 元素(标签和按钮)的?有什么联系吗?你希望self.update() 做什么?你不想调用函数showTasks()吗?

标签: python python-3.x pyqt5


【解决方案1】:

一种可能的解决方案是在字典中映射按钮和标签,通过 sender 方法获取按钮,然后使用 deleteLater 删除它们。

class App(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.taskList = ["Some text 1", "Some text 2", "some text 3"]

        self.initUI()

    def initUI(self):
        self.title = "Task list"
        self.main_layout = QVBoxLayout()
        self.grid = QGridLayout()
        self.input_field = QLineEdit()
        self.add = QPushButton("add")
        self.add.clicked.connect(self.handle_add_clicked)
        self.grid.addWidget(self.input_field, 0, 0)
        self.grid.addWidget(self.add, 0, 1)

        self.mapping_widget = {}

        self.showTasks()

        self.main_layout.addLayout(self.grid)
        self.main_layout.addStretch()

        self.setLayout(self.main_layout)
        self.setWindowTitle(self.title)
        self.resize(300, 100)
        self.show()

    def add_task(self, task):
        row = self.grid.rowCount()
        task_label = QLabel(task)
        task_button = QPushButton("X")
        task_button.clicked.connect(self.handle_delete_clicked)
        self.grid.addWidget(task_label, row, 0)
        self.grid.addWidget(task_button, row, 1)
        self.mapping_widget[task_button] = task_label

    def showTasks(self):
        for task in self.taskList:
            self.add_task(task)

    def handle_add_clicked(self):
        task = self.input_field.text()
        self.add_task(task)

    def handle_delete_clicked(self):
        button = self.sender()
        if not isinstance(button, QPushButton):
            return

        label = self.mapping_widget.get(button)
        if label is None:
            return

        del self.mapping_widget[button]
        button.deleteLater()
        label.deleteLater()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多