我有一个listWidget,它包含多个QListWidgetItem,为了简单起见,让我们假设每个QListWidgetItemQWidgetQPushButton组成,QPushButton称为delete.这是用以下代码汇编的:

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)

这是在主应用程序中调用的,如下所示:

def additem(self):
    self.referenceDict[self.itemID] = widgetItem(self)  

现在,我的目标是在按下按钮时,将这个特定的小部件从ferenceDict和listWidget中删除.每个WidgetItem也有自己的字符串形式的ItemID,并且可以访问listWidget和ferenceDict.我怎么写这deleteSelf??我试过用self.deleteLater,但似乎只删除了QWidget,而没有删除QListWidgetItem.调用self.listWidgetItem.deleteLater会引发属性错误,因为它不能以这种方式删除.我也try 了parent.referenceDict.pop(self.itemID),但由于某种原因,它引发了一个键错误,尽管当我打印出词典时,两个键都匹配.

推荐答案

您可以使用takeItem方法删除列表标题项,使用deleteLater方法删除小部件.

我不喜欢您 Select 的创建小部件并将它们添加到列表的过程,所以我继续创建了一个最小的示例,但使用QPushButton而不是QWidget来创建itemWidget.

示例:

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()

Python相关问答推荐

Python在tuple上操作不会通过整个单词匹配

C#使用程序从Python中执行Exec文件

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

Stacked bar chart from billrame

实现神经网络代码时的TypeError

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

python中csv. Dictreader. fieldname的类型是什么?'

合并与拼接并举

交替字符串位置的正则表达式

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

根据Pandas中带条件的两个列的值创建新列

将CSS链接到HTML文件的问题

用fft计算指数复和代替求和来模拟衍射?

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

我什么时候应该使用帆布和标签?

合并相似列表

具有不匹配列的2D到3D广播

奇怪的Base64 Python解码

Pandas 数据框自定义排序功能