我偶然发现了这一点(很明显,这是从更大的应用程序中摘录的):

import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *

if __name__ == '__main__':

    app = QApplication(sys.argv)

    d = {}

    widget = QWidget()
    d[widget] = 'hashable'

    item = QListWidgetItem('abc')
    d[item] = 'unhashable'


如果运行此命令,则在最后一行获得:

TypeError: unhashable type: 'PySide2.QtWidgets.QListWidgetItem'


据我所知,就像任何用户定义的类实例一样,任何Qt对象都可以用作dict键。

我在Windows 7上运行PySide2 5.13.0,Python 3.6.4。在Ubuntu 18.04,Python 3.6.9,PySide 5.9.0a1上遇到相同的错误。

感谢您的提示。

最佳答案

QListWidgetItem(类似于QTableWidgetItem和QTreeWidgetItem)不可散列,因为与行关联的QListWidgetItem可以在不通知的情况下进行更改,这与QObjects(例如QWidget,QPushButton等)不同。

如果您的目标是将信息与QListWidgetItem相关联,则可以使用setData()data()方法。

import sys

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QListWidget, QListWidgetItem, QWidget

if __name__ == "__main__":

    app = QApplication(sys.argv)

    w = QListWidget()

    for i in range(10):
        it = QListWidgetItem("abc-{}".format(i))
        it.setData(Qt.UserRole, "data-{}".format(i))
        w.addItem(it)

    def on_currentItemChanged():
        current = w.currentItem()
        print(current.data(Qt.UserRole))

    w.currentItemChanged.connect(on_currentItemChanged)
    w.show()
    sys.exit(app.exec_())

关于python - QListWidgetItem对象无法散列,是错误还是有原因?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59693563/

10-11 08:46