代码之家  ›  专栏  ›  技术社区  ›  fredrik

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

  •  3
  • fredrik  · 技术社区  · 7 年前

    我希望能够设置 itemData combobox 当使用 QAbstractTableModel 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
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   ekhumoro    7 年前

    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