PyQt: как изменить currentIndex в QComboBox при изменении пользовательских данных QAbstractListModel

Я прочитал несколько примеров того, как определить пользовательскую модель для виджета QComboBox.

Вот как я определил свою модель:

class LevelListModel(QAbstractListModel):
    def __init__(self, parent=None, *args):
        """ datain: a list where each item is a row
        """
        QAbstractListModel.__init__(self, parent, *args)
        self.levelList = []
    def rowCount(self, parent=QModelIndex()):
        return len(self.levelList)

    def data(self, index, role):
        if index.isValid() and role == Qt.DisplayRole:
            return QVariant(index.row())
        else:
            return QVariant()
    def addLevel(self,level):
        self.beginResetModel()
        self.levelList.append(level)
        self.endResetModel()

Я установил модель на свою QComboBox:

self.levelListModel = LevelListModel()
self.ui.levelComboBox.setModel(self.levelListModel)

Я добавляю модель в свой список следующим образом:

newLevel = Level (self.levelListModel.rowCount() + 1)
self.levelListModel.addLevel(newLevel)

Элемент добавлен правильно, и я вижу его внутри поля со списком, но я хотел бы изменить currentIndex на индекс нового элемента.

Я предполагаю, что QAbstractListModel может вызывать какие-то события, которые QComboBox может прослушивать, но я пока не нашел, как это сделать.

Мои вопросы:

  1. Как я могу уведомить QComboBox об изменении данных модели и прослушать это событие, чтобы соответствующим образом изменить currentIndex?
  2. Я использовал [begin|end]ResetModel, потому что моя запись должна быть упорядоченной последовательностью целых чисел. Поэтому мне нужно полностью перестроить список данных после удаления элемента в середине списка. Я не знаю, правильный ли это путь. Любое лучшее решение?

person Heisenbug    schedule 27.11.2012    source источник


Ответы (1)


1

Как я могу уведомить QComboBox об изменении данных модели и прослушать это событие, чтобы соответствующим образом изменить currentIndex?

Нет необходимости слушать событие из того, как вы делаете вещи. Вы знаете, когда данные модели изменяются, потому что добавляете элементы самостоятельно. Просто измените currentIndex после добавления данных.

Я бы, вероятно, изменил метод addLevel, чтобы он возвращал QModelIndex добавленного элемента, а затем использовал его для установки currentIndex из QComboBox:

class LevelListModel(QAbstractListModel):
    # [skipped]
    def addLevel(self,level):
        self.beginInsertRows(QModelIndex(), len(self.levelList), len(self.levelList))
        self.levelList.append(level)
        self.endInsertRows()
        return self.index(len(self.levelList)-1)

и

newLevel = Level (self.levelListModel.rowCount() + 1)
newIndex = self.levelListModel.addLevel(newLevel)
self.ui.levelComboBox.setCurrentIndex(newIndex)

2

Я использовал [begin|end]ResetModel, потому что моя запись должна быть упорядоченной последовательностью целых чисел. Поэтому мне нужно полностью перестроить список данных после удаления элемента в середине списка. Я не знаю, правильный ли это путь. Любое лучшее решение?

Это зависит. [begin|end]ResetModel для действительно кардинальных изменений. Я не понимаю, как сохранение упорядоченного списка целых чисел может привести к таким изменениям для добавления/удаления одного элемента. Из того, что вы описываете, вы должны использовать [begin|end]InsertRows и [begin|end]RemoveRows.

person Avaris    schedule 27.11.2012