PYQT4 QlistWidget: currentItem и selectedItem отличаются, когда вызывается currentItemchaged, почему?

Поэтому мне любопытно узнать, как на самом деле работают методы currentItem()) и selectedItems() QlistWidget.

Что у меня есть (упрощенно): - У меня есть QlistWidget со списком элементов (usersList) - У меня активирован QAbstractViewItem.extendedSelection - У меня есть QLineEdit (userAge) - У меня есть словарь DataDict с ключом: значение ==> ListItem.text ():QlineEdit.текст())

-Я подключил 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), но я хочу, чтобы пользователь мог выбирать несколько элементов, измените userAge и 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 (что неверно, потому что выбран только текущийItem)

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

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

заранее большое спасибо


person alkimia    schedule 03.01.2017    source источник


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

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

ваше здоровье

person alkimia    schedule 03.01.2017