Я использую пользовательский делегат для отображения столбца со списком в моем QTableView.
В дополнение к проблеме выбора по умолчанию ( введите описание ссылки здесь ) у меня есть проблема, когда я переупорядочиваю данные моего QTableView (для каждого столбца или применяя фильтры). Комбоксы остаются там, где они были, когда сетка не отображалась.
Есть ли способ заставить перекрасить делегата? Я скопировал код метода рисования (без индекса), но это только вызвало сбой моей программы.
Дайте мне знать, если я не достаточно ясен.
Вот код моего пользовательского делегата:
class ComboBoxDelegate(QtGui.QItemDelegate):
def __init__(self, parent, itemslist):
QtGui.QItemDelegate.__init__(self, parent)
self.itemslist = itemslist
self.parent = parent
def paint(self, painter, option, index):
# Get Item Data
value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
# value = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
# fill style options with item data
style = QtGui.QApplication.style()
opt = QtGui.QStyleOptionComboBox()
opt.currentText = str(self.itemslist[value])
opt.rect = option.rect
# draw item data as ComboBox
style.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt, painter)
self.parent.openPersistentEditor(index)
def createEditor(self, parent, option, index):
##get the "check" value of the row
# for row in range(self.parent.model.rowCount(self.parent)):
# print row
self.editor = QtGui.QComboBox(parent)
self.editor.addItems(self.itemslist)
self.editor.setCurrentIndex(0)
self.editor.installEventFilter(self)
self.connect(self.editor, QtCore.SIGNAL("currentIndexChanged(int)"), self.editorChanged)
return self.editor
# def setEditorData(self, editor, index):
# value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
# editor.setCurrentIndex(value)
def setEditorData(self, editor, index):
text = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
pos = self.editor.findText(text)
if pos == -1:
pos = 0
self.editor.setCurrentIndex(pos)
def setModelData(self,editor,model,index):
value = self.editor.currentIndex()
model.setData(index, QtCore.QVariant(value))
def updateEditorGeometry(self, editor, option, index):
self.editor.setGeometry(option.rect)
def editorChanged(self, index):
check = self.editor.itemText(index)
id_seq = self.parent.selectedIndexes[0][0]
update.updateCheckSeq(self.parent.db, id_seq, check)
def updateDelegate(self, indexRow, indewCol):
# index = self.parent.model.createIndex(indexRow, indewCol)
seq_id = self.parent.model.arraydata[indexRow][0]
print seq_id
check = select.getCheck(self.parent.db, seq_id)
check = check[0][0]
print check
if check != '':
pos = self.checkDict[check]
else:
pos = 0
self.editor.setCurrentIndex(pos)
И я вызываю это из моего класса QTableView:
self.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
self.viewport().installEventFilter(self)
self.delegate = ComboBoxDelegate(self, self.checkValues)
self.setItemDelegateForColumn(13,self.delegate)
Я вызываю функцию updateDelegate при сортировке столбца (из класса модели):
def sort(self, Ncol, order):
self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()"))
self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol))
i = 0
for row in self.arraydata:
self.parent.delegate.updateDelegate(i, 13)
i += 1
if order == QtCore.Qt.DescendingOrder:
self.arraydata.reverse()
self.emit(QtCore.SIGNAL("layoutChanged()"))