Объекты QListWidgetItem недоступны для просмотра, это ошибка или есть причина? - PullRequest
1 голос
/ 11 января 2020

Я наткнулся на это (это, очевидно, выдержка из более крупного приложения):

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, как и любые пользовательские экземпляры классов.

Я использую PySide2 5.13.0, Python 3.6.4 на Windows 7. Я получаю ту же ошибку в Ubuntu 18.04, Python 3.6.9, PySide 5.9.0a1.

Спасибо за любую подсказку.

1 Ответ

2 голосов
/ 11 января 2020

QListWidgetItem (аналогично QTableWidgetItem и QTreeWidgetItem) не является хеш-таблицей, поскольку QListWidgetItem, связанный со строкой, может изменяться без уведомления в отличие от объектов QObject, таких как QWidget, QPushButton и т. Д. c.

Если ваша цель - связать информация с 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_())
...