2011-12-12 10 views
1

어떻게 QTableView 셀을 편집 할 때 원래 값을 유지할 수 있습니까? 셀 편집을 시작하면 자동으로 지워집니다. 나는 그 곳 곳곳을 수색했는데 나는 어딘가로 인도 할 포인터를 찾을 수 없다. 모델보기 구현 :편집 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 

답변

6

data 메서드는 항상 데이터를 표시 할 책임이 있습니다. 편집하는 동안 EditRole을 사용합니다. 그래서 아래와 같이 DisplayRole 같은 EditRole의 값을 표시하도록 data 방법을 수정

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 
+0

좋은, 감사합니다! Qt 워드 프로세서는이 점에서 조금 부족합니다. – marrat