2013-03-14 228 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