mar*_*rat 1 python qt datamodel qtableview pyside
如何让QTableView单元格在编辑时保持其原始值?当我开始编辑单元格时,它会自动清除.我搜索了整个地方,我找不到任何会引导某个地方的指针.我的模型视图的实现:
class BlockViewModel(QAbstractTableModel):
    def __init__(self, structure, data):
        QAbstractTableModel.__init__(self)
        self._data = data
        self._struct = structure
        for i, s in enumerate(structure):
            cmnt = s['comment']
            name = cmnt if cmnt else s['name']
            self.setHeaderData(i, Qt.Horizontal, name)
    def rowCount(self, parent=QModelIndex()):
        return len(self._data)
    def columnCount(self, parent = QModelIndex()):
        return len(self._struct)
    def data(self, index, role):
        if role == Qt.DisplayRole:
            try:
                row = index.row()
                col = index.column()
                name = self._struct[col]['name']
                return self._data[row][name]
            except:
                pass
        elif role == Qt.CheckStateRole:
            return None
        return None
    def flags(self, index):
        flags = super(self.__class__,self).flags(index)
        flags |= Qt.ItemIsEditable
        flags |= Qt.ItemIsSelectable
        flags |= Qt.ItemIsEnabled
        flags |= Qt.ItemIsDragEnabled
        flags |= Qt.ItemIsDropEnabled
        return flags
    def headerData(self, section, orientation, role = Qt.DisplayRole):
        if role != Qt.DisplayRole:
            return None
        if orientation == Qt.Horizontal:
            cmnt = self._struct[section]['comment']
            return cmnt if cmnt else self._struct[section]['name']
        else:
            return str(section)
    def setData(self, index, value, role=Qt.EditRole):
        row = index.row()
        col = index.column()
        name = self._struct[col]['name']
        self._data[row][name] = value
        self.emit(SIGNAL('dataChanged()'))
        return True
该data方法负责始终显示您的数据.在编辑时,它使用EditRole.因此,修改您的data方法以显示EditRole相同的值,DisplayRole如下所示:
def data(self, index, role):
    if role == Qt.DisplayRole or role == Qt.EditRole:
        try:
            row = index.row()
            col = index.column()
            name = self._struct[col]['name']
            return self._data[row][name]
        except:
            pass
    elif role == Qt.CheckStateRole:
        return None
    return None