我有一个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),但由于某种原因,尽管当我打印字典时两个键都匹配,但它还是引发了一个键错误。
您可以使用该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)
| 归档时间: |
|
| 查看次数: |
626 次 |
| 最近记录: |