0

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

我有什么(简化): -我有一个带有项目列表的 QlistWidget(usersList) -我有 QAbstractViewItem.extendedSelection 激活 -我有 QLineEdit(userAge) -我有一个字典 DataDict 与 key: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 中保存/加载数据适用于一个项目(当前项目),但我希望用户能够选择多个项目将 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.text() 和 selectedItems(),currentItem 和 selectedItem 是不同的)[0].text() 当我输入 savData()

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

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

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

非常感谢你

4

1 回答 1

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] 这是自己的数据,它给了我想要的行为

但我仍然不知道为什么会发生这种情况以及为什么会解决问题

干杯

于 2017-01-03T21:57:53.313 回答