Во-первых, я новичок в python и pyqt, поэтому, пожалуйста, потерпите меня.
Я использую QTableView с QSqlTableModel, все работает как задумано.
Последний столбец представления содержит только 0 и 1 в качестве значения, которое я хочу отобразить как флажок, и этот столбец должен быть редактируемым.
Я прочитал, что вы должны создать подкласс QItemDelegate, что я и сделал. К сожалению, моя таблица не будет отображать последний столбец как флажок.
Я пытался установить делегат только для последнего столбца (так, как я бы предпочел), используя setItemDelegateForColumn (), он не работал. Поэтому я изменил его и установил для всего QTableView, используя setItemDelegate (), реагируя только на запросы к последнему столбцу. Это все еще не будет работать. «Не работать» означает, что сообщений об ошибках нет, просто он не будет делать то, что я говорю;) Кажется, что ни один из методов, которые я переопределил, никогда не вызывается, кроме init (). Так что я предполагаю, что я упускаю что-то фундаментальное.
Я извлек соответствующие строки кода, KSCheckBoxDelegate - мой подкласс. Это версия, в которой делегат настроен для всего QTableView.
-- code from applications main class --
self.taglist = QTableView()
self.tagmodel = QSqlTableModel()
self.tagmodel.setTable("data")
self.tagmodel.select()
self.taglist.setModel(self.tagmodel)
print self.taglist.itemDelegate()
myDel = KSCheckBoxDelegate(self)
myDel.colnumber = 3
self.taglist.setItemDelegate(myDel)
-- KSCheckBoxDelegate.py --
from PyQt4.QtGui import *
class KSCheckBoxDelegate(QStyledItemDelegate):
colnumber = None
def __init__ (self, parent = None):
print "KSCheckBoxDelegate::init"
QStyledItemDelegate.__init__(self, parent)
def createEditor(self, parent, option, index):
print "KSCheckBoxDelegate::createEditor"
if index.column()==self.colnumber:
return QCheckBox(self)
else:
return QStyledItemDelegate.createEditor(self, parent, option, index)
def setEditorData (self, editor, index):
print "KSCheckBoxDelegate::setEditorData"
if index.column() == self.colnumber:
cont = index.model().data(index, Qt.DisplayRole).toString()
if cont == "1":
editor.setCheckState(Qt.Checked)
else:
editor.setCheckState(Qt.UnChecked)
else:
QStyledItemDelegate.setEditorData(self,editor, index)
def setModelData (self, editor, model, index):
print "KSCheckBoxDelegate::setModelData"
if index.column() == self.colnumber:
if editor.checkBox.checkState() == Qt.Checked:
model.setData(index, 1)
else:
model.setData(index, 0)
else:
QStyledItemDelegate.setModelData(self, editor, model, index)
Есть какие-нибудь подсказки для меня по этому вопросу?
Кроме того, у меня возникают трудности с сигналом currentChanged () в модели выбора QTableViews. Я печатаю верхние правые координаты выделения. Я продолжаю получать неправильные индексы (не недействительные) при нажатии левой кнопкой мыши. Использование клавиш курсора дает мне правильные индексы. Использование selectionChanged () имеет такое же поведение. Я на самом деле получаю координаты второй последней выбранной ячейки QTableView. Например, я нажимаю на координаты <1,1> <2,1>, второй щелчок покажет мне координаты <1,1>.
selInd = self.taglist.selectionModel().selectedIndexes()
if(len(selInd) > 0):
self.xPosData=selInd[0].column()
self.yPosData=selInd[0].row()
Исправлено самостоятельно, с использованием QTableView.currentIndex () вместо selectionModel.selectedIndexes () :)
И, наконец, использование OnManualSubmit в качестве editStrategy не выдает ошибку (возвращает false) при вызове submitAll (), но также не сохраняет данные. Это работает с выбором OnFieldChange как editStrategy. С чем я могу жить, но я не собирался этого делать.
Спасибо за ваше время.
Хорст