2014-04-10 4 views
1

QMainWindow로 작업하고 QTableView 위젯을 추가하고 있습니다. 테이블은 csv 파일의 데이터로 채워집니다. csv 파일의 첫 번째 행에는 헤더가 있지만 해당 행을 헤더에 쓰는 방법을 찾을 수 없습니다. 테스트 헤더 목록을 입력해도 작동하지 않습니다.pyqt4 QMainWindow의 QTableView with csv 입력 및 헤더

또한 "시간"열을 역순으로 정렬하고 싶습니다.

여기에 대부분의 표를 제한 코드 :

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


class UserWindow(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(UserWindow, self).__init__() 
     self.specModel = QtGui.QStandardItemModel(self) 
     self.specList = self.createSpecTable() 
     self.initUI() 

    def specData(self): 
     with open('testFile.csv', 'rb') as csvInput: 
      for row in csv.reader(csvInput): 
       if row > 0: 
        items = [QtGui.QStandardItem(field) for field in row] 
        self.specModel.appendRow(items) 

    def createSpecTable(self): 
     self.specTable = QtGui.QTableView() 
     # This is a test header - different from what is needed 
     specHdr = ['Test', 'Date', 'Time', 'Type'] 
     self.specData() 
     specM = specTableModel(self.specModel, specHdr, self) 
     self.specTable.setModel(specM) 
     self.specTable.setShowGrid(False) 
     vHead = self.specTable.verticalHeader() 
     vHead.setVisible(False) 
     hHead = self.specTable.horizontalHeader() 
     hHead.setStretchLastSection(True) 
     self.specTable.sortByColumn(3, Qt.DescendingOrder) 
     return self.specTable 

    def initUI(self): 
     self.ctr_frame = QtGui.QWidget() 

     self.scnBtn = QtGui.QPushButton("Sample") 
     self.refBtn = QtGui.QPushButton("Reference") 
     self.stpBtn = QtGui.QPushButton("Blah") 

# List Window 
     self.specList.setModel(self.specModel) 

# Layout of Widgets 
     pGrid = QtGui.QGridLayout() 
     pGrid.setSpacing(5) 
     pGrid.addWidget(self.scnBtn, 3, 0, 1, 2) 
     pGrid.addWidget(self.refBtn, 3, 2, 1, 2) 
     pGrid.addWidget(self.stpBtn, 3, 4, 1, 2) 
     pGrid.addWidget(self.specList, 10, 0, 20, 6) 
     self.ctr_frame.setLayout(pGrid) 
     self.setCentralWidget(self.ctr_frame) 
     self.statusBar() 

     self.setGeometry(300, 300, 400, 300) 
     self.setWindowTitle('Test') 


class specTableModel(QAbstractTableModel): 
    def __init__(self, datain, headerdata, parent=None, *args): 

     QAbstractTableModel.__init__(self, parent, *args) 
     self.arraydata = datain 
     self.headerdata = headerdata 

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

    def columnCount(self, parent): 
     return len(self.arraydata[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 headerData(self, col, orientation, role): 
     if orientation == Qt.Horizontal and role == Qt.DisplayRole: 
      return self.headerdata[col] 
     return None 


def main(): 

    app = QtGui.QApplication(sys.argv) 
    app.setStyle(QtGui.QStyleFactory.create("plastique")) 
    ex = UserWindow() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

이 여기 정말 짧은 CSV 파일입니다

Run,Date,Time,Comment 
data1,03/03/2014,00:04,Reference 
data2,03/03/2014,02:00,Reference 
data5,03/03/2014,02:08,Sample 
data6,03/03/2014,13:57,Sample 

는 또한 rowCount의 & 열 개수 정의가 작동하지 않습니다.

답변

1

내가 게시 한 것에 대한 답변 : csv 파일의 첫 번째 줄을 읽기 위해 'getHeader'함수를 작성하고 목록을 반환했습니다. 다음을 createSpecTable 함수에 추가했습니다.

specHdr = self.getHeader() 
self.specModel.setHorizontalHeaderLabels(specHdr) 
self.specModel.sort(2, Qt.DescendingOrder) 

마지막 문장은 역 정렬 문제를 해결했습니다. CSV 파일, 헤더 라인은 specData 함수 마지막 행을 추가하여 테이블에서 제거 하였다

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

def columnCount(self, parent): 
    return self.arraydata.columnCount() 
: 마지막

self.specModelremoveRow(0). 

를 rowCount 열 개수와 함께 수정 된