pyqt - populating QTableWidget with csv data

后端 未结 3 1647
悲&欢浪女
悲&欢浪女 2020-11-29 10:03

I have a QTableWidget, i export the data from this table to a csv file. But now, i want to Open a existing csv file and populate my table with this data. how can i do it?

3条回答
  •  再見小時候
    2020-11-29 10:20

    Looks like you could use the csv module here:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import csv
    
    import sip
    sip.setapi('QString', 2)
    sip.setapi('QVariant', 2)
    
    from PyQt4 import QtGui, QtCore
    
    class MyWindow(QtGui.QWidget):
        def __init__(self, fileName, parent=None):
            super(MyWindow, self).__init__(parent)
            self.fileName = fileName
    
            self.model = QtGui.QStandardItemModel(self)
    
            self.tableView = QtGui.QTableView(self)
            self.tableView.setModel(self.model)
            self.tableView.horizontalHeader().setStretchLastSection(True)
    
            self.pushButtonLoad = QtGui.QPushButton(self)
            self.pushButtonLoad.setText("Load Csv File!")
            self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)
    
            self.pushButtonWrite = QtGui.QPushButton(self)
            self.pushButtonWrite.setText("Write Csv File!")
            self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
    
            self.layoutVertical = QtGui.QVBoxLayout(self)
            self.layoutVertical.addWidget(self.tableView)
            self.layoutVertical.addWidget(self.pushButtonLoad)
            self.layoutVertical.addWidget(self.pushButtonWrite)
    
        def loadCsv(self, fileName):
            with open(fileName, "rb") as fileInput:
                for row in csv.reader(fileInput):    
                    items = [
                        QtGui.QStandardItem(field)
                        for field in row
                    ]
                    self.model.appendRow(items)
    
        def writeCsv(self, fileName):
            with open(fileName, "wb") as fileOutput:
                writer = csv.writer(fileOutput)
                for rowNumber in range(self.model.rowCount()):
                    fields = [
                        self.model.data(
                            self.model.index(rowNumber, columnNumber),
                            QtCore.Qt.DisplayRole
                        )
                        for columnNumber in range(self.model.columnCount())
                    ]
                    writer.writerow(fields)
    
        @QtCore.pyqtSlot()
        def on_pushButtonWrite_clicked(self):
            self.writeCsv(self.fileName)
    
        @QtCore.pyqtSlot()
        def on_pushButtonLoad_clicked(self):
            self.loadCsv(self.fileName)
    
    if __name__ == "__main__":
        import sys
    
        app = QtGui.QApplication(sys.argv)
        app.setApplicationName('MyWindow')
    
        main = MyWindow("/path/to/MyFile.csv")
        main.show()
    
        sys.exit(app.exec_())
    

    PyQt5 version:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import csv
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class MyWindow(QtWidgets.QWidget):
        def __init__(self, fileName, parent=None):
            super(MyWindow, self).__init__(parent)
            self.fileName = fileName
    
            self.model = QtGui.QStandardItemModel(self)
    
            self.tableView = QtWidgets.QTableView(self)
            self.tableView.setModel(self.model)
            self.tableView.horizontalHeader().setStretchLastSection(True)
    
            self.pushButtonLoad = QtWidgets.QPushButton(self)
            self.pushButtonLoad.setText("Load Csv File!")
            self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)
    
            self.pushButtonWrite = QtWidgets.QPushButton(self)
            self.pushButtonWrite.setText("Write Csv File!")
            self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
    
            self.layoutVertical = QtWidgets.QVBoxLayout(self)
            self.layoutVertical.addWidget(self.tableView)
            self.layoutVertical.addWidget(self.pushButtonLoad)
            self.layoutVertical.addWidget(self.pushButtonWrite)
    
        def loadCsv(self, fileName):
            with open(fileName, "r") as fileInput:
                for row in csv.reader(fileInput):    
                    items = [
                        QtGui.QStandardItem(field)
                        for field in row
                    ]
                    self.model.appendRow(items)
    
        def writeCsv(self, fileName):
            with open(fileName, "w") as fileOutput:
                writer = csv.writer(fileOutput)
                for rowNumber in range(self.model.rowCount()):
                    fields = [
                        self.model.data(
                            self.model.index(rowNumber, columnNumber),
                            QtCore.Qt.DisplayRole
                        )
                        for columnNumber in range(self.model.columnCount())
                    ]
                    writer.writerow(fields)
    
        @QtCore.pyqtSlot()
        def on_pushButtonWrite_clicked(self):
            self.writeCsv(self.fileName)
    
        @QtCore.pyqtSlot()
        def on_pushButtonLoad_clicked(self):
            self.loadCsv(self.fileName)
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        app.setApplicationName('MyWindow')
    
        main = MyWindow("data.csv")
        main.show()
    
        sys.exit(app.exec_())
    

提交回复
热议问题