Question

I am working with a QMainWindow and adding a QTableView widget. The table is to be filled with data from a csv file. The csv file first row has the headers, but I cannot find how to write that row into the headers. Even inputting a test header list does not work.

Also I want to reverse sort on the "time" column.

Here is code restricted to mostly the table:

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()

and here is a really short csv file:

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

Also the rowCount & columnCount definitions do not work.

Was it helpful?

Solution

Worked out answers to what I posted: Wrote a 'getHeader' function simply to read the first line of the csv file and returned the list. Added the following to the createSpecTable function:

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

The last statement solved the reverse sort problem. The header line from the csv file was removed from the table by adding a last line to the specData function:

self.specModelremoveRow(0).

Finally the rowCount and columnCount were corrected with:

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

def columnCount(self, parent):
    return self.arraydata.columnCount()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top