Как добавить Select one в QComboBox при использовании QAbstractTableModel (Model/View)?

Я использую QAbstractTableModel для заполнения QComboBox. Это прекрасно работает, но я хочу, чтобы самый первый индекс со списком всегда содержал значение «Выберите один ...».

Возможно ли это, и если да, то как?


У меня есть combobox, для которого я установил модель:

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:
            # Set the item's text
            project = self._projects[row]
            name = project.name()
            return name
        elif role == QtCore.Qt.UserRole and column == 0:
            # Set the "itemData"
            project = self._projects[row]
            id = project.id()
            return id

person fredrik    schedule 08.10.2017    source источник


Ответы (1)


Вы можете добавить соответствующее условие при получении/установке значений и при необходимости настроить количество/число строк. В приведенном ниже примере показано, как это сделать, но вы должны тщательно проверять весь свой код, чтобы убедиться, что строка всегда корректируется правильно при доступе к элементам _projects. (И обратите внимание, что вам не нужно корректировать номер строки при доступе к строкам в самой модели).

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) + 1 # adjust row count

    def columnCount(self, parent):
        return 2

    def data(self, index, role):
        row = index.row() - 1 # adjust row number
        column = index.column()

        if role == QtCore.Qt.DisplayRole and column == 0:
            if row >= 0:
                # Set the item's text
                project = self._projects[row]
                return project.name()
            else:
                return 'Select one...'
        elif role == QtCore.Qt.UserRole and column == 0 and row >= 0:
            # Set the "itemData"
            project = self._projects[row]
            id = project.id()
            return id

    def setData(self, index, value, role):
        row = index.row() - 1  # adjust row number
        column = index.column()

        # ignore the first item in the model
        if role == QtCore.Qt.DisplayRole and column == 0 and row >= 0:
            project = self._projects[row]
            project.setName(value) # or whatever
person ekhumoro    schedule 08.10.2017