在 ItemSelectedChanged() 上获取当前项目 QListWidget

Posted

技术标签:

【中文标题】在 ItemSelectedChanged() 上获取当前项目 QListWidget【英文标题】:Getting current item QListWidget on ItemSelectedChanged() 【发布时间】:2021-04-23 01:26:14 【问题描述】:

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

为什么会出现这个错误?

【问题讨论】:

我相信您正在尝试对上面的代码进行一些拖放,对吧?如果是这样,请注意不是应该如何进行拖放,您应该使用拖放framework that Qt provides。我知道这不容易理解,但这是实现它的正确方法。 【参考方案1】:

这个问题是因为当一个项目被移除时,选择也会改变,所以它会创建一个递归:

    选择一个项目 信号被发射并且... 函数被调用 函数删除项目 先前选择的项目不再存在,因此 Qt 尝试选择一个新项目 选择改变,信号再次发出 回到 3(因此,递归)

在选择更改中删除项目是一个的想法,应该永远这样做。

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

    拖动操作应始终使用鼠标事件(通常是mouseMoveEvent,但在某些情况下mouseButtonPress 也是可能的),而不是选择; Qt 为拖放提供了强大而可靠的支持,任何其他以不同方式实现这些操作的尝试都被认为是不好的做法,因为大多数情况下会导致意外行为、错误或崩溃(如本例中) ;

【讨论】:

感谢您的回答。我如何将项目拖出 QListWidget?我找到了 doc.qt.io/qt-5/… ,但它没有说明如何将项目 拖出 QListWidget。

以上是关于在 ItemSelectedChanged() 上获取当前项目 QListWidget的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess:在所有页面上强制 www,在一个页面上强制 https,在所有其他页面上强制 http

应用程序可以在模拟器上完美运行,但不能在物理设备上[在iOS 13.3.1上]

在 Android 上使用 Flutter 显示在其他应用上

AVAssetExportSession 在 iPad 上工作,在 iPhone 上没有音频

地理定位在笔记本电脑上工作,但不在智能手机上

java基础面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?