2012-10-28 2 views
1

에 연결된 PyQt QTableView이 있습니다.이 자체는 항목 목록을 관리하는 사용자 정의 클래스에 연결됩니다. 목록의 끝에 항목을 삽입 할 수 있으며 적절하게 내 모델에 알리고 beginInsertRowsendInsertRows을 호출합니다. 그 두 함수를 호출하고 목록 자체가 업데이트되었는지 확인할 수 있지만 테이블은 data을 호출하여 업데이트 된 행을 검색하지 않습니다.행이 추가 될 때 PyQt QAbstractTableModel이 업데이트되지 않음

무슨 일 이니? 어떻게 해결할 수 있습니까?

class FigureTableModel(QAbstractTableModel): 
    def __init__(self): 
     QAbstractTableModel.__init__(self) 

     def changed(index): 
      start_index = self.createIndex(index, 0) 
      end_index = self.createIndex(index, COLUMNS - 1) 
      self.dataChanged.emit(start_index, end_index) 

     def adding_row(index): 
      self.beginInsertRows(self.createIndex(0, 0), index, index) 
      print 'adding ', index 

     def added_row(index): 
      self.endInsertRows() 
      print 'added' 

     figures.dataChanged.connect(changed) 
     figures.rowAdding.connect(adding_row) 
     figures.rowAdded.connect(added_row) 

    def rowCount(self, parent): 
     return len(figures) 

    def columnCount(self, parent): 
     return COLUMNS 

    def data(self, index, role): 
     print 'in data' 
     if not index.isValid(): 
      return EMPTY 

     return figures[index.row()].get_table_item(index.column(), role) 

답변

2

문제의 원인은 하나라고 생각됩니다. 그것은 라인에 관하여 :

self.beginInsertRows(self.createIndex(0, 0), index, index) 

self.createIndex(0, 0) 유효한 QModelIndex를 생성합니다. 이는 parentbeginInsertRows으로 나타내므로 기본적으로 테이블의 첫 번째 행에 하위를 추가 할 것임을 뷰에 알리고 있습니다. 테이블에는 하위 개념이 없으므로 (계층 적 구조는 아닙니다) 아무 것도하지 않습니다.

표의 경우 parent은 유효하지 않은 항목이어야합니다. QModelIndex, 즉 항목이 루트에 있음을 의미합니다. 그래서, 당신은 사용해야합니다 :

self.beginInsertRows(QtCore.QModelIndex(), index, index) 
# or depending on how you import 
self.beginInsertRows(QModelIndex(), index, index) 

그 말은, 이상한 것으로 날 때리는 몇 가지가있다.

처음에는 index 메서드 외부에서 createIndex을 직접 호출하지 않아야합니다. 그렇지 않으면 일을 망칠 쉽습니다. index 메서드 자체는 QModelIndex 인스턴스를 만드는 일관된 방법을 제공해야합니다. 귀하의 경우에는 QAbstractTableModel을 상속하므로 index 메서드가 이미 구현되어 있습니다.

둘째, 글로벌 변수를 사용하고 있습니다. 많이. 일반적으로 나쁜 습관으로 간주됩니다. 수업에 필요한 경우 __init__으로 전달하십시오. 예를 들어, 지금은 두 개의 독립적 인 모델을 인스턴스화 할 수 없습니다. 그들은 모두 동일한 글로벌 figure 변수를 사용할 것이기 때문입니다. 또는 EMPTY이 무엇을 말하는지 모르겠지만 data은 잘못된 유형의 경우 None을 반환해야합니다. 다른 이름은 필요 없습니다. 마찬가지로 COLUMNSfigures에서 가져 오거나 명시 적 값이 필요하면 __init__으로 전달해야합니다.

+0

'index'와'createIndex'에 대해 알아두면 좋을 것 같습니다. 그것은 문서에서 아주 명확하지 않다. 전역 변수의 경우,'COLUMNS'와'EMPTY'는 기본적으로 모두 정적 인 상수입니다 ('EMPTY'는 문서마다 잘못된'QVariant'입니다). '수치 '가 싱글 톤이기 때문에 세계적인 수치가있다. UI에는 이러한 테이블 중 하나만 있습니다. –

+0

@ChrisB .:'createIndex'에 관해서 ... 기술적으로 아무 데나 사용하는 것이 잘못된 것은 아니지만 그렇게 할 이유가별로 없습니다. 일반적으로'index'와'parent'만이'QModelIndex'를 생성해야합니다. 다른 메소드는 이러한 메소드에 인덱스를 요청할 수 있습니다. – Avaris

관련 문제