【问题标题】:pyqt4 QTableView in QMainWindow with csv input and headers带有csv输入和标题的QMainWindow中的pyqt4 QTableView
【发布时间】:2014-04-10 17:27:32
【问题描述】:

我正在使用 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 定义也不起作用。

【问题讨论】:

    标签: csv pyqt4 qtableview qmainwindow


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      相关资源
      最近更新 更多