PYQT4 QlistWidget:当调用currentItemchaged时currentItem和selectedItem不同,为什么?

时间:2017-01-03 21:19:43

标签: python-2.7 pyqt4 qlistwidget currentitem

所以我很想知道QlistWidget的currentItem()和selectedItems()方法是如何工作的。

我拥有(简化): - 我有一个带有项目列表的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)

我想做什么/问题(简化):

- 现在,在UI中保存/加载数据适用于一个项目 (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.a调用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()当我输入savData()

时,和selectedItems()[0] .text()

我注意到currentItem = currentItem(这是正确的)但是selectedItems()[0] .text()= previousItem(这是错误的,因为只选择了currentItem)

为什么会这样?我究竟做错了什么?或者我错过了什么? 为什么更改当前项目时选择没有更新?

我是新手,所以我可能做错了什么,但如果没有,请有人帮我理解发生了什么事情?

非常感谢你

1 个答案:

答案 0 :(得分:0)

所以在玩完并尝试了一些不同的东西(不合逻辑的尝试)后,我找到了解决这个问题的方法,所以我要做的就是在loadData()函数中调用usersList.setCurrentItem(current),如下所示:

**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)

这对我来说似乎非常多余,但通过这样做,当我在saveData()中打印currentItem和selectedItems()[0](当只选择了一个项目时)时,它会打印currentItem == selectedItems()[0],所以被覆盖的唯一数据是currentItem,selectedItems()[0],它是自己的数据 这给了我想要的行为

但我仍然无能为力,为什么会发生这种情况以及为什么这会解决问题

欢呼声