删除元素后刷新 QListWidget

Refresh a QListWidget after deleting elements

我在删除项目后 QListWidget 更新时遇到了一些问题。

这是部分代码:

class Window(QMainWindow):
  list_1 = []  #The items are strings
  list_2 = []  #The items are strings

  def __init__(self):
    #A lot of stuff in here

  def fillLists(self):
    #I fill the lists list_1 and list_2 with this method

  def callAnotherClass(self):
    self.AnotherClass().exec_()   #I do this to open a QDialog in a new window

class AnotherClass(QDialog):
  def __init__(self):
    QDialog.__init__(self)

    self.listWidget = QListWidget()

  def fillListWidget(self):
    #I fill self.listWidget in here

  def deleteItems(self):
    item_index = self.listWidget.currentRow()
    item_selected = self.listWidget.currentItem().text()

    for index, content in enumerate(Window.list_2):
        if content == item_selected:
            del Window.list_2[index]
            break

deleteItems方法删除项目后,我想立即在QListWidget中看到列表的剩余项目。换句话说,我需要在按下按钮 "Delete".

后立即从列表中删除项目

我在 break 调用后尝试使用 update()repaint(),但它不起作用。

我该怎么做?希望你能帮助我。

------------编辑--------------

如果我关闭 QDialogQListWidget 会更新。当我再次打开它时,我没有看到我删除的项目。因此,列表正在更新,但不会在 QDialog 仍处于打开状态时更新。

问题是您要从用于填充 QListWidget 的列表中删除项目。当您第一次创建 QListWidget 时,Qt 会在内部存储数据的 copy。更新原始来源不会从 QListWidget 中删除项目。但是,当您关闭并重新打开对话框时,会重新创建 QListWidget,因此您会看到正确的数据(因为它实际上是从源重新加载的)。

您应该使用 QListWIdget.takeItem() 来删除您想要的行。在您的情况下,这是:

item_index = self.listWidget.currentRow()
self.listWidget.takeItem(item_index)

您仍然应该从您的源列表 (Window.list_2) 以及您当前的代码中删除该项目。