如何解决在 ItemSelectedChanged() 上获取当前项目 QListWidget
我收到错误消息:“RecursionError:调用 Python 对象时超出了最大递归深度”
片段:
def makeLabel():
item = listWidget.currentItem() #RecursionError: maximum recursion depth exceeded while calling a Python object
rect = listWidget.visualItemRect(item)
itemPos = QPoint(rect.x(),rect.y())
imageSize = item.icon().actualSize(QSize(100,200))
listWidget.takeItem(listWidget.currentRow())
label = MovableLabel(self,'Pogba.jpg')
pixmap = item.icon().pixmap(imageSize)
label.setpixmap(pixmap)
label.setFixedSize(imageSize)
label.move(itemPos)
label.grabMouse()
label.oldPos = itemPos
label.clicked = False
label.show()
self.players = []
pixmap = Qpixmap()
listWidget = QListWidget(self)
listWidget.setviewmode(QListWidget.IconMode)
listWidget.setFixedSize(500,700)
listWidget.setIconSize(QSize(100,200))
listWidget.setDragDropMode(listWidget.InternalMove)
listWidget.setFocusPolicy(Qt.NoFocus) #Why no work?
listWidget.itemSelectionChanged.connect(makeLabel)
self.listWidget = listWidget
为什么我会收到此错误?
解决方法
问题是由于删除项目时选择也会发生变化,因此会创建递归:
- 选择一个项目
- 发出信号并...
- 函数被调用
- 函数删除项目
- 之前选择的项目不再存在,所以 Qt 尝试选择一个新项目
- 选择改变了,信号再次发出
- 回到 3(因此,递归)
删除选择更改中的项目是一个坏主意,并且永远不应该这样做。
一个可能的解决方案可能是在移除项目之前断开信号,但这不是一个好的解决方案,我强烈建议您不要这样做去做;在这种情况下,目标是尝试执行类似于拖放的操作,不应该这样做,原因有两个:
- 拖动操作应始终使用鼠标事件(通常为
mouseMoveEvent
,但在某些情况下mouseButtonPress
也是可能的),而不是选择; - Qt 为拖放提供了强大而可靠的支持,以不同方式实现这些操作的任何其他尝试都被视为不好的做法,因为大多数情况下会导致意外行为、错误或崩溃(例如在这种情况下) ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。