Python 如何从pyqt5中的QListWidget返回实际对象

Python 如何从pyqt5中的QListWidget返回实际对象,python,pyqt5,Python,Pyqt5,我有一个对象/类实例列表和一个QListWidget my_objects = [obj1, obj2, obj3] self.all_objects = QtWidgets.QListWidget(self.horizontalLayoutWidget) ListWidget中填充了my_对象的名称 for i in my_objects: self.all_objects.addItem(i.name) 选择ListWidget中的一个项目后,我运行一个名为listwidgetclick

我有一个对象/类实例列表和一个QListWidget

my_objects = [obj1, obj2, obj3]
self.all_objects = QtWidgets.QListWidget(self.horizontalLayoutWidget)
ListWidget中填充了my_对象的名称

for i in my_objects:
self.all_objects.addItem(i.name)
选择ListWidget中的一个项目后,我运行一个名为listwidgetclicked的函数

self.all_objects.itemClicked.connect(self.listwidgetclicked)
在这个函数中,我希望访问实例的各种属性,但是itemClicked方法似乎返回一个QListWidgetItem对象,而不是原始的obj1、obj2或obj3,这意味着我无法访问所述对象的属性

我假设一个错误可能是在for循环中,我添加了I.name而不是I本身,但是只添加I会导致类型错误,因为addItem方法将(self,str)作为参数,而不是对象

一旦选择了列表中的一个项目,我希望它返回实际的对象,以便以后可以在函数中访问它们的属性。如何实现这一点?

所有使用Qt的物品型号

在标准模型上,这些角色使用默认的s定义每个模型索引的外观:

  • DisplayRole
    用于显示所显示的(可能的)文本
  • DecorationRole
    用于“装饰”(又名:图标)
  • 等等
Qt允许为基础数据定义自定义角色,这些数据可用于存储每个模型索引的任何类型的信息

要为每个索引设置任何类型的数据,可以使用base方法。这意味着您可以为模型创建自定义角色,并使用需要引用的对象为每个索引设置数据

CustomObjectRole = QtCore.Qt.UserRole + 1

class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        # ...
        my_objects = [obj1, obj2, obj3]
        self.all_objects = QtWidgets.QListWidget(self.horizontalLayoutWidget)

        for i in my_objects:
            item = QtWidgets.QListWidgetItem(i.name)
            self.all_objects.addItem(item)
            item.setData(CustomObjectRole, i)
然后,要访问该对象,只需访问该项,然后使用或。
数据(角色)
。或者,您可以使用模型的,并从中使用
index.data(role)

def listwidgetclicked(self, item):
    obj = item.data(CustomObjectRole)
    # do something...
请注意,为确保拖放功能,自定义角色数据必须能够“pickle”(必须能够以某种方式转换为ByTestStream数据或从ByTestStream数据转换)。

请提供