2016-02-01 2 views
0

У меня возникли проблемы с обновлением QListWidget после удаления его элемента.Обновите 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, я хочу, чтобы увидеть остальные элементы списка inmediately в QListWidget. Другими словами, мне нужно удалить элемент из списка, как только я нажму кнопку «Удалить».

Я пробовал с update() и repaint() после перерыва, но он не работает.

Как я могу это сделать? Надеюсь, ты поможешь мне.

------------ Edit ---------------

QListWidget обновляется, если я закрыть QDialog. Когда я снова открою его, я не вижу элемент, который я удалил. Таким образом, список обновляется, но не в то время как QDialog все еще открыт.

+0

Честно говоря, вам не нужно называть 'repaint()'. Также в вашем коде я не вижу ни одного вызова 'update()' (именно это вам и нужно). Если он не работает, вы всегда можете воссоздать 'QListWidget' и заменить (удалить старый, а затем добавить новый) текущий с новым. – rbaleksandar

+0

Благодарим вас за ответ. Я стирал строку 'update' (ниже' break'call), прежде чем вставлять код здесь. Вы имеете в виду, что мне, возможно, придется удалить список после вызова «break» и создать еще один? –

+1

Хорошо. Что касается отдыха 'QListWidget' - на самом деле. Я бы предположил, что вы скорее удаляете все нужные вам элементы и в конце воссоздаете и снова присоединяете вновь созданный виджет. Из вашего редактирования я бы предложил добавить сигнал, который испускается всякий раз, когда список изменяется, и он войдет в слот самого QDialog, который обновит его (через 'update()', если он работает, или через отдых и перезагрузку 'QListWidget '). Таким образом, диалог будет уведомлен об изменениях. Также см. [Здесь] (http://stackoverflow.com/a/28540716/1559401) для примера с помощью repaint(). – rbaleksandar

ответ

2

Проблема в том, что вы удаляете элемент из списка, который использовался для заполнения QListWidget. Когда вы сначала создаете QListWidget, копия данных хранится внутри Qt. Обновление исходного источника не удалит элемент из QListWidget. Однако при закрытии и повторном открытии диалогового окна восстанавливается QListWidget, поэтому вы видите правильные данные (так как они эффективно перезагружаются из источника).

Чтобы удалить нужные строки, вы должны использовать QListWIdget.takeItem(). В вашем случае, это:

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

Вы все еще должны удалить элемент из списка источников (Window.list_2), а также в соответствии с вашим текущим кодом.

+0

Благодарим вас за помощь. Он работал с 'takeItem'. –