2013-03-14 230 views
2

我有一个QTableWidget,我将这个表中的数据导出到一个csv文件。 但现在,我想要打开一个现有的csv文件并使用此数据填充我的表格。我该怎么做?? 这是我的出口代码,我想要一个“填充”代码,我真的不知道该怎么做。我知道如何阅读一个csv,但我不知道如何用这个csv数据填充我的表。pyqt - 用csv数据填充QTableWidget

高清输出(个体经营):

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) 

回答

7

看起来你可以使用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_()) 
+1

谢谢你雅各布。爱德华怎么样? :3 – Marco 2013-03-18 18:16:35

+0

@psytron您应该引入您的备用代码解决方案作为新答案。阅读[我应该何时编辑代码?](https://meta.stackoverflow.com/q/260245/1677912) – Mogsdad 2018-01-04 17:53:37

2

这是我的一个项目:

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) 
+0

能QTableWidget的使用模型? – 2015-10-23 15:44:14