Python 如何使用QAbstractTableModel(模型/视图)将数据设置到QComboBox?

Python 如何使用QAbstractTableModel(模型/视图)将数据设置到QComboBox?,python,pyqt4,pyside,pyqt5,pyside2,Python,Pyqt4,Pyside,Pyqt5,Pyside2,我希望能够在使用QAbstractTableModel填充时设置组合框的itemData。但是,我只能从模型的data方法返回一个字符串 通常,当不使用模型时,可以这样执行: # Set text and data combobox.addItem('Some text', 'some item data') # Retrieve data from selected item_data = combobox.itemData(combobox.currentIndex()) 如何做到这一点

我希望能够在使用
QAbstractTableModel
填充时设置
组合框的
itemData
。但是,我只能从模型的
data
方法返回一个字符串

通常,当不使用模型时,可以这样执行:

# Set text and data
combobox.addItem('Some text', 'some item data')

# Retrieve data from selected
item_data = combobox.itemData(combobox.currentIndex())
如何做到这一点,但使用
QAbstractTableModel


我有一个组合框
,我将模型设置为:

model = ProjectTableModel(projects)
combobox.setModel(model)
我的模型:

class ProjectTableModel(QtCore.QAbstractTableModel):

    def __init__(self, projects=[], parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._projects = projects

    def rowCount(self, parent):
        return len(self._projects)

    def columnCount(self, parent):
        return 2

    def data(self, index, role):
        row = index.row()
        column = index.column()

        if role == QtCore.Qt.DisplayRole and column == 0:
            project = self._projects[row]
            name = project.name()
            id = project.id()  # <----- how to add this as itemData?
            return name
class ProjectTableModel(QtCore.QAbstractTableModel):
定义初始化(self,projects=[],parent=None):
QtCore.QAbstractTableModel.\uuuu init\uuuu(self,parent)
self.\u projects=项目
def行数(自身、父级):
返回len(自组项目)
def列数(自身、父项):
返回2
def数据(自身、索引、角色):
行=索引。行()
column=index.column()
如果角色==QtCore.Qt.DisplayRole且列==0:
项目=自身。\u项目[行]
name=project.name()
id=project.id()#A
QComboBox
始终使用模型存储其数据。如果您不自己设置模型,它将创建自己的
QStandardItemModel
。诸如
addItem
itemData
之类的方法只需使用已设置的底层模型存储和检索值。默认情况下,组合框使用
Qt.UserRole
在模型中存储项数据。因此,您的模型只需执行以下操作:

def data(self, index, role):
    row = index.row()
    column = index.column()

    if role == QtCore.Qt.DisplayRole and column == 0:
        project = self._projects[row]
        name = project.name()
        return name
    elif role == QtCore.Qt.UserRole and column == 0:
        project = self._projects[row]
        id = project.id()
        return id

def setData(self, index, value, role):
    row = index.row()
    column = index.column()

    if role == QtCore.Qt.UserData and column == 0:
        project = self._projects[row]
        project.setId(value) # or whatever