QMainWindow中的pyqt4 QTableView,带有csv输入和标题

时间:2014-04-10 17:27:33

标签: csv pyqt4 qtableview qmainwindow

我正在使用QMainWindow并添加QTableView小部件。该表将填充csv文件中的数据。 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& columnCount定义不起作用。

1 个答案:

答案 0 :(得分:1)

找到我发布的答案:写了一个' getHeader'函数只是读取csv文件的第一行并返回列表。在createSpecTable函数中添加了以下内容:

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

最后一个语句解决了反向排序问题。通过向specData函数添加最后一行,从表中删除了csv文件中的标题行:

self.specModelremoveRow(0).

最后使用以下命令更正了rowCount和columnCount:

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

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