获取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

为什么我得到这个错误?

这个问题是由于当项被删除时选择也会改变,所以它创建了一个递归:

  1. 选择项目
  2. 函数被称为
  3. 函数删除项
  4. 先前选择的项目不再存在,所以Qt尝试选择一个新项目代替
  5. 选择被改变,信号再次发出
  6. 返回到3(因此,递归)

在选择更改中删除项是一个坏主意,并且不应该这样做。

一个可能的解决方案could在删除项目之前断开信号,但这不是一个好的解决方案,我强烈建议你这样做;在本例中,目标是尝试执行类似于拖放的操作,应该像这样执行而不是,原因有两个:

  1. 拖动操作应该总是使用鼠标事件(通常是mouseMoveEvent,但mouseButtonPress也有可能),而不是选择;
  2. Qt为拖放提供了强大而可靠的支持,任何其他以不同方式实现这些操作的尝试都被认为是不好的做法,因为大多数时候会导致意想不到的行为,错误或崩溃(就像在这种情况下);

相关内容

  • 没有找到相关文章

最新更新