在 ItemSelectedChanged() 上获取当前项目 QListWidget
Getting current item QListWidget on ItemSelectedChanged()
我收到错误:“递归错误:调用 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
为什么会出现此错误?
问题是由于 selection 在删除项目时也会发生变化,因此会产生递归:
- select 一项
- 发出信号并...
- 函数被调用
- 函数删除项目
- 之前 selected 的项目不再存在,因此 Qt 尝试 select 一个新项目来代替
- select离子改变,信号再次发射
- 回到3(因此,递归)
在 select离子变化中移除项目是一个糟糕的想法,绝不应该这样做。
一个可能的解决方案可能是在移除物品之前断开信号,但这不是好的 解决方案,我强烈反对你这样做;在这种情况下,objective 是尝试做类似于拖放的操作,不应该 这样做,有两个重要原因:
- 拖动操作应始终使用鼠标事件(通常
mouseMoveEvent
,但有些情况下mouseButtonPress
也是可能的),而不是selections;
- Qt 为拖放提供了强大而可靠的支持,任何其他以不同方式实现这些操作的尝试都被认为是不好的做法,因为大多数时候会导致意外行为、错误或崩溃(就像在这个案例);
我收到错误:“递归错误:调用 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
为什么会出现此错误?
问题是由于 selection 在删除项目时也会发生变化,因此会产生递归:
- select 一项
- 发出信号并...
- 函数被调用
- 函数删除项目
- 之前 selected 的项目不再存在,因此 Qt 尝试 select 一个新项目来代替
- select离子改变,信号再次发射
- 回到3(因此,递归)
在 select离子变化中移除项目是一个糟糕的想法,绝不应该这样做。
一个可能的解决方案可能是在移除物品之前断开信号,但这不是好的 解决方案,我强烈反对你这样做;在这种情况下,objective 是尝试做类似于拖放的操作,不应该 这样做,有两个重要原因:
- 拖动操作应始终使用鼠标事件(通常
mouseMoveEvent
,但有些情况下mouseButtonPress
也是可能的),而不是selections; - Qt 为拖放提供了强大而可靠的支持,任何其他以不同方式实现这些操作的尝试都被认为是不好的做法,因为大多数时候会导致意外行为、错误或崩溃(就像在这个案例);