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

2024-06-24 12:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象/类实例列表和一个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)作为参数,而不是对象

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


Tags: 对象实例函数self列表for属性objects
1条回答
网友
1楼 · 发布于 2024-06-24 12:31:08

Qt中的所有项模型都使用"roles"

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

  • 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)

然后,要访问该对象,只需访问该项,然后使用^{}^{}.data(role)。或者,您可以使用模型的^{}并从那里使用index.data(role)

def listwidgetclicked(self, item):
    obj = item.data(CustomObjectRole)
    # do something...

请注意,为了确保拖放功能,自定义角色数据必须能够“pickle”(它必须能够以某种方式与ByTestStream数据进行转换)

相关问题 更多 >