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], это собственные данные, которые дают мне поведение, которое я хочу

но я до сих пор не знаю, почему это происходит и почему это решает проблему

ура

Другие вопросы по тегам