0

我收到错误:“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

为什么我会收到此错误?

4

1 回答 1

0

问题是由于在删除项目时选择也会更改,因此它会创建递归:

  1. 选择一个项目
  2. 发出信号,然后...
  3. 该函数被调用
  4. 该功能删除项目
  5. 先前选择的项目不再存在,因此 Qt 尝试选择一个新项目
  6. 选择改变,信号再次发射
  7. 回到 3 (因此,递归)

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

一个可能的解决方案是在移除项目之前断开信号,但这不是一个好的解决方案,我强烈建议您这样做;在这种情况下,目标是尝试做一些类似于拖放的事情,应该这样做,原因有两个:

  1. 拖动操作应始终使用鼠标事件(通常mouseMoveEvent,但也有mouseButtonPress可能的情况),而不是选择;
  2. Qt 为拖放提供了强大而可靠的支持,任何其他以不同方式实现这些操作的尝试都被认为是不好的做法,因为大多数情况下会导致意外行为、错误或崩溃(就像在这种情况下一样);
于 2021-01-18T18:20:43.910 回答