所以我很想知道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)
为什么会这样?我究竟做错了什么?或者我错过了什么? 为什么更改当前项目时选择没有更新?
我是新手,所以我可能做错了什么,但如果没有,请有人帮我理解发生了什么事情?
非常感谢你
答案 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],它是自己的数据 这给了我想要的行为
但我仍然无能为力,为什么会发生这种情况以及为什么这会解决问题
欢呼声