PYQT4 QlistWidget: currentItem и selectedItem различаются при вызове currentItemchaged, почему?
Поэтому мне интересно узнать, как на самом деле работают методы currentItem ()) и selectedItems () в QlistWidget.
Что у меня (упрощенно): -У меня есть QlistWidget со списком элементов (usersList) -У меня активирован QAbstractViewItem.extendedSelection -У меня есть QLineEdit(userAge) -У меня есть словарь DataDict с ключом: value ==> ListItem.text(): QlineEdit.text())
-Я подключил userAge.textChanged к функции saveData
**def** *saveData*():
currentItem=str(usersList.currentItem().text())
DataDict[currentItem]=QlineEdit.text()
-Я подключил 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 и setData на все selectedItems, и я пытаюсь это сделать изменив мой saveData() примерно так:
def saveData():
for item in usersList.selectedItems():
currentItem=str(item.text())
DataDict[currentItem]=QlineEdit.text()
-проблема в том, что когда я изменил currentItem, нажав на другой элемент, данные предыдущего перезаписываются текущим загруженным
-Я знаю, что, вероятно, происходит (если я не ошибаюсь):
1. Я нажимаю на другой элемент (изменение текущего элемента). 2.CurrentItemChanged запускается. 3. Называется loadData(). 3. Называется userAge.clear (). 3.b userAge.textChanged запускается 3.c saveData() вызывается (теперь с пустым) 3.d userAge.setText(data)
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)
почему это происходит? Что я делаю неправильно? или чего мне не хватает? почему выбор не обновляется при изменении текущего элемента?
Я новичок, так что я могу что-то делать не так, но если нет, то может кто-нибудь помочь мне понять, что происходит?
заранее большое спасибо
1 ответ
Поэтому, поиграв и попробовав что-то другое (не логично, просто пытаясь), я нашел решение этой проблемы, поэтому то, что я должен сделать, называется usersList.setCurrentItem (current) внутри функции 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] (когда выбран только один элемент) в saveData(), он печатает currentItem==selectedItems()[0], поэтому единственные данные перезаписывается currentItem,selectedItems()[0], это собственные данные, которые дают мне поведение, которое я хочу
но я до сих пор не знаю, почему это происходит и почему это решает проблему
ура