Отображение текста QComboBox, а не значения индекса в QStyledItemDelegate - PullRequest
1 голос
/ 25 августа 2010

Итак, у меня есть модель, и одна из колонок содержит страну.Однако, поскольку я хочу отобразить поле со списком, чтобы выбрать страну из списка параметров, я не сохраняю название страны в модели напрямую.Вместо этого я сохраняю значение индекса в списке допустимых стран.Это позволяет мне использовать QComboBox в моем виде формы, как рекомендовано в документации Qt.Проблема в том, что у меня также есть табличное представление, и табличное представление отображает целое число индекса, а не название страны.Я настроил QStyledItemDelegate и внедрил createEditor, поэтому, если вы щелкнете по ячейке мира, появится ComboBox, но когда вы не редактируете страну, вы увидите значение индекса.* Я часть пути к решению.Я реализовал метод рисования для выполнения работы, но он отображает смещение значения в правильном положении, и я не могу понять, как заставить его отображаться правильно.Я думаю, option.rect.topLeft() в методе рендеринга неправильный, но я не могу понять, как правильно установить чертеж.

def paint(self, painter, option, index):
    if index.column() == COUNTRY:
        painter.save()
        countryRef, ok = inex.data().toInt()
        countryStr = country_list[countryRef]
        widget = QLineEdit()
        widget.setGeometry(option.rect)
        widget.setText(countryStr)
        widget.render(painter, option.rect.topLeft())
        painter.store()
    else:
        QStylyedItemDelegate.paint(self, painter, option, index)

1 Ответ

4 голосов
/ 25 августа 2010

Модели имеют разные роли данных элемента для разных данных. Среди прочих есть Qt::DisplayRole, Qt::EditRole и Qt::UserRole. В этом случае вы хотите отобразить что-то отличное от ваших фактических данных, поэтому добавьте новую роль, скажем, Qt::UserRole+1, которая используется для вашего индекса.

Затем вы хотите, чтобы ваш делегат установил соответствующие данные в setModelData :

def setModelData(self, editor, model, index):
    cbIndex = editor.currentIndex()
    model.setData(index, cbIndex, Qt.UserRole+1)
    # we want a nice displayable though
    model.setData(index, countryIndexToDisplayable(cbIndex), Qt.DisplayRole)

Конечно, вы получите данные для установки в редакторе аналогичным образом:

def setEditorData(self, widget, index):
    widget.setCurrentIndex(index.data(Qt.UserRole+1))

В зависимости от вашей модели и вида вы можете использовать Qt::EditRole, который в значительной степени предназначен для этой цели. Если вы затем используете собственный тип для роли отображения, вам не нужно выполнять какие-либо пользовательские рисования, хотя вы можете, если хотите.

...