views:

376

answers:

1

Hi,

I have a QTableView with QSqlTableModel and with 3 columns, now I need to have:
- second column: spinbox after clicked to edit
- third column: checkbox (displayed center)

My code:

class SpinBoxDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
    editor = QtGui.QSpinBox(parent)
    editor.setMinimum(0)
    editor.setMaximum(100)
    print 'spinbox'
    return editor

def setEditorData(self, spinBox, index):
    value = index.model().data(index, QtCore.Qt.EditRole).toInt()[0]

    spinBox.setValue(value)

def setModelData(self, spinBox, model, index):
    spinBox.interpretText()
    value = spinBox.value()

    model.setData(index, value, QtCore.Qt.EditRole)

def updateEditorGeometry(self, editor, option, index):
    editor.setGeometry(option.rect)

class myQSqlTableModel(QtSql.QSqlTableModel):
def flags(self,index):
    result = QtSql.QSqlTableModel.flags(self,index);
    if index.column() == 2:
        result |= QtCore.Qt.ItemIsUserCheckable
    return result
def data(self,index,role):
    if not index.isValid: return QtCore.QVariant()

    value = QtSql.QSqlTableModel.data(self, index, role)
    if index.column() == 2:
        if role == QtCore.Qt.CheckStateRole:
            return QtCore.Qt.Unchecked if QtSql.QSqlTableModel.data(self, index).toInt()[0] else QtCore.Qt.Checked 
        elif role == QtCore.Qt.DisplayRole:
            return QtCore.QVariant()
    return value

and

    self.model = myQSqlTableModel(self)
    self.model.setTable("person")
    self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
    self.model.select():


    self.model.setHeaderData(0, QtCore.Qt.Horizontal,
                             self.tr("ID"))
    self.model.setHeaderData(1, QtCore.Qt.Horizontal,
                             self.tr("A"))
    self.model.setHeaderData(2, QtCore.Qt.Horizontal,
                             self.tr("B"))

    self.view = QtGui.QTableView()
    self.view.setModel(self.model)
    self.view.setSortingEnabled(True)

    spinDelegate = SpinBoxDelegate()
    self.view.setItemDelegateForColumn(1,spinDelegate)

but it does't work: spinbox don't show after click and checkbox can't be clicked and is aligned to left

Any help?

A: 

I'm having this problem too. Googling a LOT, I found this: http://qt.nokia.com/developer/task-tracker/index_html?id=132870+&method=entry
So it seems to be fixed since 4.2.2. However I'm almost sure I'm using post 4.5 Qt/PyQt version.
I've also noted this problem is most common with PyQt. I could be a problema with PyQt, dunno. Maybe no one uses this method on C++?
I think I'll try the SpinBox example in C++ with setItemDelegateForColumn to see if that works.

Rodrigo Coacci