当按下小部件中的按钮时,PyQt5 删除 QListWidgetItem

Chr*_*tex 5 python pyqt5

我有一个listWidget包含多个QListWidgetItem的,为了简单起见,我们假设每个都由一个和一个被调用QListWidgetItem的 组成。这是用以下代码组装的:QWidgetQPushButtondelete

class widgetItem(QtWidgets.QWidget):
    def __init__(self, parent):
        super(widgetItem, self).__init__()
        uic.loadUi('UIfiles/trainingWidget.ui', self) # Load the .ui file

        self.listWidgetItem = QtWidgets.QListWidgetItem()
        self.listWidgetItem.setSizeHint(self.sizeHint())
        self.delete.clicked.connect(self.deleteSelf)
        parent.listWidget.addItem(self.listWidgetItem)
        parent.listWidget.setItemWidget(self.listWidgetItem, self)
Run Code Online (Sandbox Code Playgroud)

这在主应用程序中被调用:

def additem(self):
    self.referenceDict[self.itemID] = widgetItem(self)  
Run Code Online (Sandbox Code Playgroud)

现在,我的目标是在按下按钮时从 referenceDict 和 listWidget 中删除这个特定的小部件。每个widgetItem也有自己的itemID作为字符串,并且可以访问listWidget以及referenceDict。我如何写这个deleteSelf?我尝试过使用self.deleteLater,但似乎它只删除了QWidget而不是删除了QListWidgetItem。调用self.listWidgetItem.deleteLater会引发属性错误,因为无法通过这种方式删除它。我也尝试过parent.referenceDict.pop(self.itemID),但由于某种原因,尽管当我打印字典时两个键都匹配,但它还是引发了一个键错误。

Ale*_*der 2

您可以使用该takeItem方法删除列表项,并使用该deleteLater方法删除小部件。

我不喜欢您选择的创建小部件并将其添加到列表中的过程,因此我继续创建了一个最小的示例,但使用QPushButtonitemWidgets 代替 QWidgets。

例子:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Window(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.listWidget = QListWidget(self)
        self.layout.addWidget(self.listWidget)
        self.addListItems()

    def addListItems(self):           # creates the item widgets
        for _ in range(5):
            item = QListWidgetItem(type=0)
            widget = ListItem("button", self, item)
            self.listWidget.addItem(item)
            self.listWidget.setItemWidget(item, widget)

    def removeWidgetItem(self, item):  # removes the item widgets
        index = self.listWidget.indexFromItem(item).row()
        item = self.listWidget.takeItem(index)

class ListItem(QPushButton):

    def __init__(self, text, parent, item):
        super().__init__(text, parent)
        self.item = item                     # the ListWidgetItem
        self._parent = parent                # the Window
        self.clicked.connect(self.deleteSelf)

    def deleteSelf(self):                    # slot for button click
        self._parent.removeWidgetItem(self.item)
        self.deleteLater()

app = QApplication([])
window = Window()
window.show()
app.exec()
Run Code Online (Sandbox Code Playgroud)