2014-04-01 9 views
6

Qt 프로그래밍에 초보자입니다. 단추를 클릭하여 행을 추가 할 수있는 간단한 테이블을 만들려고합니다. 나는 테이블을 잘 구현할 수 있지만 테이블에 표시 할 업데이트 된 데이터를 가져올 수 없습니다. 내 문제는 단추를 사용하여 모든 종류의 "데이터 변경"메서드를 제대로 호출 할 수 없다는 사실에서 기인한다고 생각합니다. 나는 여러 가지 솔루션을 온라인으로 시도해 왔으며 그 중 4 년이 된 모든 막 다른 게시물이 있습니다. 지금까지 가지고있는 기본 구조는 새 데이터로 테이블을 업데이트하는 방법을 파악할 수 없습니다.PyQt : QAbstractTableModel을 사용하여 QTableView에 행 추가

이것은 내가 몇 가지 테스트 데이터와 설정 한 기본보기

입니다.

최종 구현에서 테이블이 비어있을 것이므로 행을 추가하고 테이블보기에 표시하려고합니다.

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MyWindow(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 

     # create table 
     self.get_table_data() 
     self.table = self.createTable() 

     # layout 
     self.layout = QVBoxLayout() 

     self.testButton = QPushButton("test") 
     self.connect(self.testButton, SIGNAL("released()"), self.test)   

     self.layout.addWidget(self.testButton) 
     self.layout.addWidget(self.table) 
     self.setLayout(self.layout) 

    def get_table_data(self): 
     self.tabledata = [[1234567890,2,3,4,5], 
          [6,7,8,9,10], 
          [11,12,13,14,15], 
          [16,17,18,19,20]] 

    def createTable(self): 
     # create the view 
     tv = QTableView() 

     # set the table model 
     header = ['col_0', 'col_1', 'col_2', 'col_3', 'col_4'] 
     tablemodel = MyTableModel(self.tabledata, header, self) 
     tv.setModel(tablemodel) 

     # set the minimum size 
     tv.setMinimumSize(400, 300) 

     # hide grid 
     tv.setShowGrid(False) 

     # hide vertical header 
     vh = tv.verticalHeader() 
     vh.setVisible(False) 

     # set horizontal header properties 
     hh = tv.horizontalHeader() 
     hh.setStretchLastSection(True) 

     # set column width to fit contents 
     tv.resizeColumnsToContents() 

     # set row height 
     tv.resizeRowsToContents() 

     # enable sorting 
     tv.setSortingEnabled(False) 

     return tv 

    def test(self): 
     self.tabledata.append([1,1,1,1,1]) 
     self.emit(SIGNAL('dataChanged()')) 
     print 'success' 

class MyTableModel(QAbstractTableModel): 
    def __init__(self, datain, headerdata, parent=None): 
     """ 
     Args: 
      datain: a list of lists\n 
      headerdata: a list of strings 
     """ 
     QAbstractTableModel.__init__(self, parent) 
     self.arraydata = datain 
     self.headerdata = headerdata 

    def rowCount(self, parent): 
     return len(self.arraydata) 

    def columnCount(self, parent): 
     if len(self.arraydata) > 0: 
      return len(self.arraydata[0]) 
     return 0 

    def data(self, index, role): 
     if not index.isValid(): 
      return QVariant() 
     elif role != Qt.DisplayRole: 
      return QVariant() 
     return QVariant(self.arraydata[index.row()][index.column()]) 

    def setData(self, index, value, role): 
     pass   # not sure what to put here 

    def headerData(self, col, orientation, role): 
     if orientation == Qt.Horizontal and role == Qt.DisplayRole: 
      return QVariant(self.headerdata[col]) 
     return QVariant() 

    def sort(self, Ncol, order): 
     """ 
     Sort table by given column number. 
     """ 
     self.emit(SIGNAL("layoutAboutToBeChanged()")) 
     self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol))  
     if order == Qt.DescendingOrder: 
      self.arraydata.reverse() 
     self.emit(SIGNAL("layoutChanged()")) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 
+1

샘플 코드 주셔서 감사합니다 :

그래서 그냥 이런 식으로 뭔가를 필요로한다! 대단히 도움이된다! – Hephaestus

+0

동의 귀하의 질문에있는 코드 샘플은 다른 많은 질문에 대한 답변입니다. –

답변

3

모델이 변경의 기본 데이터가 모델이 방출해야하는 경우 중 하나 layoutChanged 또는 layoutAboutToBeChanged, 그래서 제대로 그보기 업데이트 (당신이 세포의 특정 범위를 업데이트 할 경우 dataChanged는,도있다).

def test(self): 
     self.tabledata.append([1,1,1,1,1]) 
     self.table.model().layoutChanged.emit() 
     print 'success' 
+0

모델에서 setData()가 필요하지 않습니까? 모든 문서를 살펴 봤는데 setData() 또는 insertRows() 등이 필요한 참조를 계속 볼 수 있습니다. 문제는 setData() 메서드를 구현하는 방법을 100 % 확신 할 수 없거나 더 중요한 방법 불러라. - 편집 : 음, 방금 편집을 시도했지만 setData() 메서드가 없어도 완벽하게 작동하므로 결국 필요하지 않습니다. 정말 도움을 주셔서 감사합니다! – user3439556

+0

일반적으로 모델에서 올바른 값을 업데이트하기 위해 편집 가능한 표가 필요할 때 setData()를 구현해야합니다. 예를 들면 다음과 같습니다. 'def setData (self, index, value, role = Qt.EditRole) : role == Qt.EditRole : setattr (self.arraydata [index.row()], self.columns [index. 열(), 값) self.dataChanged.emit (index, index,()) else : return False' – TheGerm