【问题标题】:editing QTableView cell value编辑 QTableView 单元格值
【发布时间】:2012-01-18 18:29:43
【问题描述】:

如何让 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

【问题讨论】:

    标签: python qt pyside qtableview datamodel


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 2016-10-31
      • 2012-12-05
      相关资源
      最近更新 更多