2017-01-03 23 views
0

Мне интересно узнать, как работают методы currentItem()) и selectedItems() QlistWidget.PYQT4 QlistWidget: currentItem и selectedItem different при вызове currentItemchaged, почему?

То, что я (упрощенно): -I есть QListWidget со списком элементов (Список пользователей задается) -Я QAbstractViewItem.extendedSelection активированный -Есть QLineEdit (userAge) -Есть словарь DataDict с ключом : значение ==> ListItem.text(): QlineEdit.text())

-I подключили userAge.textChanged к функции SaveData

**def** *saveData*(): 
    currentItem=str(usersList.currentItem().text()) 

    DataDict[currentItem]=QlineEdit.text() 

-I подключен usersList.currentItemChanged к функции loadData:

**def** *loadData*(current,_previous): 
     currentItem=current.text() 
     #get data 
     data=dataDict[currentItem] 
     #clear previous data 
     userAge.clear() 
     #set Data 
     userAge.setText(data) 

, что я хочу сделать/проблемы (упрощенный):

-Верно теперь сохранение/загрузка данных в интерфейсе работает для одного элемента (CurrentItem), но я хочу, чтобы пользователь возможность выбора нескольких элементов изменить usersAge и УстановитьДанный весь SelectedItems, и я пытаюсь сделать это, изменив свой сейв() следующим образом:

def saveData(): 
    for item in usersList.selectedItems(): 
     currentItem=str(item.text()) 
     DataDict[currentItem]=QlineEdit.text() 

-The проблема сейчас в том, что, когда я изменил CurrentItem щелкнув по другому элементу данные предыдущего s переопределены током загружен один

Я знаю, Что, вероятно, происходит это (если я не ошибаюсь): 1.I нажмите на другой предмет (изменение текущего элемента) 2.currentItemChanged срабатывает 3. LoadData() называется 3.a userAge.clear() называется 3.b userAge.textChanged срабатывает 3.c сейв() вызывается (теперь с пустым) 3.d userAge.setText (данные)
3.e userAge.textChanged запускается 3.f saveData() вызывается (с загруженными данными)

- В моей голове это должно работать нормально, потому что currentItem/selectedItem одинаковы, но причиной этой проблемы является то, что при вызове saveData() currentItem и selectedItem отличаются, если я печатаю currentItem.text() и selectedItems() [0] .text() Когда я ввел savData()

Я заметил, что currentItem = currentItem (что правильно), но selectedItems() [0] .text() = previousItem (что неверно, currentItem)

Почему это происходит? Что я делаю не так? или что мне не хватает? Почему выбор не обновляется при изменении текущего элемента?

Я новичок, поэтому, возможно, я что-то делаю неправильно, но если бы кто-то не помог мне понять, что происходит?

спасибо заранее

ответ

0

так после игры вокруг и пытаясь немного разные вещи (не логично просто пытается) я нашел решение этой проблемы, так что я должен сделать, это называется Список пользователей задается.setCurrentItem (ток) внутри LoadData() функция, как так:

**def** *loadData*(current,_previous): 
    currentItem=current.text() 
    #get data 
    data=dataDict[currentItem] 
    #clear previous data 
    userAge.clear() 
    #FIX 
    usersList.setCurrentItem(current) 
    #set Data 
    userAge.setText(data) 

это кажется очень излишним для меня, но, делая это, когда я печатаю CurrentItem и SelectedItems() [0] (если выбран только один элемент) в сейв() печатает CurrentItem == SelectedItems() [0], поэтому onlye данные перезаписываются является CurrentItem, SelectedItems() [0], которые являются собственные данные , которые дают мне поведение я хочу

но я 'все еще неясно, почему это происходит и почему это устраняет проблему.

ура