Пример замены модели и использования делегатов для таблицы

Нужно изготовить вот такую редактируемую таблицу:

 

delegate

Это делается вот таким кодом:

browser=sc(None, u"Розничные цены")
browser.addLine("cc",u"Продукт",10,rel=u"ccard@cc@name")
browser.addLine("price",u"Цена",10,cods="A9",pic="999,999,999")
browser.heap.mem=mem

def append(browser):
    def realAppend():
        for x in browser.zzGridWidget.model().rasx:
            browser.zzGridWidget.selectRow(x)
            dic={"CC":browser.t.r.cc,"ROZ_PRICE":browser.zzGridWidget.model().rasx[x]}
            browser.heap.mem.t.zzDb.setrow("ccard",dic)
            browser.heap.mem.refresh()
        browser.windows.gridWindow.closeWindow()
    return realAppend

browser.addAction(u"Записать в справочник",append(browser),icon="images/ok.png")

cursor=zzCursor("""select cc,roz_price as price
                            from ccard
                            where cc in
                                (
                                select cc from menui where parent_uid=%s and cc not in (select izd from cnrm)
                                union
                                select mat as cc from cnrm where izd in (select cc from menui where parent_uid=%s )
                                )""" % (mem.t.r.uid,mem.t.r.uid))
#cursor.browse()
browser.setDataSource(cursor)

def ini(browser):
    def realIni():
        class myDelegate(QItemDelegate):
            def createEditor(self, parent, option, index):
                editor = zzLineEdit("",pic="999,999,999")
                editor.setParent(parent)
                editor.autoFocus=False
                editor.setMaximumWidth(99999)
                return editor
            def setEditorData(self, le, index):
                value =u"%s" % index.model().data(index, Qt.DisplayRole).toString()
                le.setText(value)
            def setModelData(self, le, model, index):
                value = le.text()
                model.setData(index, QVariant(value), Qt.EditRole)
            def updateEditorGeometry(self, editor, option, index):
                editor.setGeometry(option.rect)
        
        class editModel(pentadb.zzModel):
            def __init__(self,zzModel):
                pentadb.zzModel.__init__(self,zzModel)
                self.zzModel=zzModel
                self.rasx={}
            def setData(self, index, data, role):
                text=data.toString()
                self.rasx[index.row()]=text
#                if num(text)==0:
#                    del self.rasx[index.row()]
                return True
            def data(self,index, role=Qt.DisplayRole):
                curcol=self.zzModel.columns[index.column()]
                if role==Qt.DisplayRole and curcol=='price':
                    if index.row() in self.rasx:
                        return QVariant(u"%s" % tran(self.rasx[index.row()],"999,999,999"))
                    else:
                        return self.zzModel.data(index,role)
                elif role == Qt.BackgroundRole and curcol=='price':
                    return QVariant(QColor("lightgreen"))    
                else:
                    return self.zzModel.data(index,role)
            def flags(self,index):
                curcol=self.zzModel.columns[index.column()]
                if curcol=='price':
                    return Qt.ItemIsDragEnabled | Qt.ItemIsSelectable | Qt.ItemIsDropEnabled | Qt.ItemIsEnabled |Qt.ItemIsEditable
                else:
                    return Qt.ItemIsDragEnabled | Qt.ItemIsSelectable | Qt.ItemIsDropEnabled | Qt.ItemIsEnabled
                
        browser.zzGridWidget.grid.setModel(editModel(browser.zzGridWidget.grid.model()))
        browser.zzGridWidget.grid.setItemDelegate(myDelegate())
        browser.zzGridWidget.grid.selectRow(0)
    return realIni
    
browser.initfunc=ini(browser)
browser.runBrowse()