QListWidgetItem 对象是不可散列的,这是一个错误还是有原因的?
QListWidgetItem objects are unhashable, it is a bug or there's a reason?
我偶然发现了这个(很明显,这是一个更大的应用程序的摘录):
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 对象都可以用作字典键,就像任何用户定义的 class 实例一样。
我在 运行ning PySide2 5.13.0,Python 3.6.4 Windows 7。我在 Ubuntu 18.04,Python 3.6.9, PySide 5.9.0a1.
感谢任何提示。
QListWidgetItem(类似于 QTableWidgetItem 和 QTreeWidgetItem)不是散列表,因为与行关联的 QListWidgetItem 可以在没有通知的情况下更改,这与 QWidget、QPushButton 等 QObject 不同
如果您的目标是将信息与 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_())
我偶然发现了这个(很明显,这是一个更大的应用程序的摘录):
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 对象都可以用作字典键,就像任何用户定义的 class 实例一样。
我在 运行ning PySide2 5.13.0,Python 3.6.4 Windows 7。我在 Ubuntu 18.04,Python 3.6.9, PySide 5.9.0a1.
感谢任何提示。
QListWidgetItem(类似于 QTableWidgetItem 和 QTreeWidgetItem)不是散列表,因为与行关联的 QListWidgetItem 可以在没有通知的情况下更改,这与 QWidget、QPushButton 等 QObject 不同
如果您的目标是将信息与 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_())