Я реализовал следующий делегат, чтобы предоставить выпадающее имя в QTableView. Вариант использования заключается в замене столбца (ключа), который обычно не имеет смысла для пользователя (например, числовой идентификатор) с текстовым эквивалентом.Как создать combo-box QItemDelegate
Сниппет ниже работ (в том числе для сохранения правильного значения), но у него есть три вопроса:
- Он отображает исходное значение, вместо текста эквивалент.
- Выбор строк в QTableView предоставляет все столбцы, но не тот, у кого есть этот делегат.
- В идеале я хотел бы, чтобы выпадающее поле появлялось как таковое, без необходимости нажимать на него, чтобы узнать, что это одно.
Примечание: Ключ может представлять собой любую строку (не обязательно целое число). Типичным примером может служить страна (значение «Франция» соответствует ключу «FR»).
class ComboDelegate(QtGui.QItemDelegate):
"""
A delegate that places a QComboBox in every
cell of the column to which it is being applied
"""
def __init__(self, parent, value_data):
"Value_data is a list of tuples: (item, label)"
QtGui.QItemDelegate.__init__(self, parent)
self.value_data = value_data
@property
def items(self):
"The list of items for display"
return [item[0] for item in self.value_data]
@property
def labels(self):
"The list of labels for display"
return [item[1] for item in self.value_data]
def item(self, label):
"Get the item from a label"
try:
index = self.labels.index(label)
except ValueError:
pass
print("Value no: &%s" % index)
return self.items[index]
def createEditor(self, parent, option, index):
"Create the editor (called each time)"
combo = QtGui.QComboBox(parent)
for duplet in self.value_data:
# the duplet is label, item
item, label = duplet
combo.addItem(label)
combo.currentIndexChanged.connect(self.currentIndexChanged)
return combo
def setEditorData(self, editor, index):
editor.blockSignals(True)
editor.setCurrentIndex(index.row())
editor.blockSignals(False)
def setModelData(self, editor, model, index):
"This is the data stored into the field"
print("Current text: %s" % editor.currentText())
model.setData(index, self.item(editor.currentText()))
def currentIndexChanged(self):
self.commitData.emit(self.sender())
спасибо: это ясно и элегантно! Я забыл упомянуть, что ключ может быть любой строкой, а не только целым числом (обычно «FR» => «Франция», «IT» => «Италия» и т. Д. – fralau
@fralau обновить мое решение – eyllanesc
Еще раз спасибо! Если значение, возвращаемое как строка (IT для Италии и т. д.), будет лучшим для вас? – fralau