pyqt - 使用csv数据填充QTableWidget

问题描述 投票:3回答:2

我有一个QTableWidget,我将此表中的数据导出到csv文件。但现在,我想打开一个现有的csv文件并用这些数据填充我的表。我该怎么做?

这是我的导出代码,我想要一个“填充”代码,我真的不知道该怎么做..我知道如何阅读csv但我不知道如何用这个csv数据填充我的表。

def export(self):
    nomeArquivo = "nomeArquivo"
    filename = unicode(QFileDialog.getSaveFileName(self, "Document - Choose Export File", nomeArquivo+".csv"))
    if not filename:
            return
    self.model.sort()
    fh = None
    try:

            fh = QFile(filename)
            if not fh.open(QIODevice.WriteOnly):                     
                raise IOError, unicode(fh.errorString())
            stream = QTextStream(fh)
            stream.setCodec("UTF-8")              
            for row in range(self.model.rowCount()):
                TSentence = self.model.data(
                self.model.index(row, TABELA.SENTENCE)).toString()
                TIrony = self.model.data(   
                self.model.index(row, TABELA.IRONY)).toString()

                stream  << "\""<< TSentence << "\"" << ";" << "\""<< TIrony <<"\"" <<"\n" 

    except (IOError, OSError), e:
        QMessageBox.warning(self, "Text - Error",
                "Failed to export: %s" % e)

    finally:
        if fh:
            fh.close()
    QMessageBox.warning(self, "Text - Export",
            "Successfully exported text to %s" % filename)
python csv pyqt qtablewidget
2个回答
8
投票

看起来你可以在这里使用csv模块:

#!/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版本:

#!/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_())

3
投票

这来自我的一个项目:

def setup_relation(self,rel):

    self.table.insertRow(0)

    for i in rel.header.attributes:
        item=QtGui.QTableWidgetItem()
        item.setText(i)
        self.table.insertColumn(self.table.columnCount())
        self.table.setItem(0,self.table.columnCount()-1,item)

    for i in rel.content:
        self.table.insertRow(self.table.rowCount())
        for j in range(len(i)):
            item=QtGui.QTableWidgetItem()
            item.setText(i[j])
            self.table.setItem(self.table.rowCount()-1,j,item)
© www.soinside.com 2019 - 2024. All rights reserved.