2016-10-20 1 views
1

Ich versuche, Daten von einem QTableWidget zu lesen und sie in einer CSV-Datei zu speichern.Unerwünschtes Zeichen in der CSV-Datei beim Serialisieren von QTableWidget

Die in der Datei gespeicherten Werte sind korrekt, aber für die erste Spalte in jeder Zeile gibt es am Anfang ein unerwünschtes Zeichen.

Hier ist mein Code:

void Task::on_button_Export_clicked() 
{ 
    QString fileName = QFileDialog::getSaveFileName(this,tr("Export Task List"), "",tr("CSV Files (*.csv)")); 
    if (fileName.isEmpty()) 
      return; 
    else 
    { 
     QFile file(fileName); 
     if (!file.open(QIODevice::WriteOnly)) 
     { 
      QMessageBox::information(this, tr("Unable to open file"), 
      file.errorString()); 
      return; 
     } 
     QDataStream out(&file); 
     out.setVersion(QDataStream::Qt_5_4); 
     int rowCount = ui->tableWidget->rowCount(); 
     int colCount = ui->tableWidget->columnCount(); 
     for (int i = 0; i < rowCount; i++) 
     { 
      QString str(QString::null); 

      /* if (i > 0) 
      { 
       str = "\n"; 
      }*/ 

      for (int j = 0; j < colCount; j++) 
      { 
       if (j > 0) 
       { 
        str += ","; 
       } 
       QTableWidgetItem* item = ui->tableWidget->item(i,j); 
       str += item->data(Qt::DisplayRole).toString(); 
      } 
      str += "\n"; 
      out << str; 
     } 
    } 
} 

Die gespeicherte Datei sieht wie folgt aus:

ÎDPC Task 
ÞMain Task 
ÌWorkLoop 
ÐWorkLoop 
ÌIST0 
ÊIST1 
ÆIST2 

ich verwende Qt 5.4.0.

Jede Hilfe hier würde sehr geschätzt werden.

+0

'QString str (QString :: null);' - was ist das? Schreiben Sie einfach 'QString str;'. Übrigens gibt es die 'QTextStream' Klasse zum Erstellen von Strings. –

+0

Ich versuchte String str zuerst. Meine Vermutung war, dass es einen Garbage-Wert bekam, der später in QString str (QString :: null) geändert wurde, um es mit Null zu initialisieren –

Antwort

1

Ihre else am Anfang ist nutzlos, wenn Sie return verwenden, um die Ausführung der Funktion zu beenden (Sie haben else im zweiten Test nicht verwendet).

Wenn Sie Text schreiben müssen, sollten Sie einen QTextStream statt QDataStream verwenden, der Binärdaten lesen/schreiben soll.

Warum verwenden Sie eine temporäre QString in Sie Schleifen? Sie haben einen Strom, verwenden Sie es:

void Task::on_button_Export_clicked() { 
    QString fileName = QFileDialog::getSaveFileName(
     this,tr("Export Task List"), "",tr("CSV Files (*.csv)") 
    ); 
    if (fileName.isEmpty()) { 
     return; 
    } 

    QFile file(fileName); 
    if (!file.open(QIODevice::WriteOnly)) { 
     QMessageBox::information(this, tr("Unable to open file"), 
     file.errorString()); 
     return; 
    } 

    QTextStream out(&file); 
    int rowCount = ui->tableWidget->rowCount(); 
    int colCount = ui->tableWidget->columnCount(); 

    for (int i = 0; i < rowCount; i++) { 
     /* if (i > 0) { 
      out << "\n"; 
     }*/ 
     for (int j = 0; j < colCount; j++) { 
      if (j > 0) { 
       out << ","; 
      } 
      QTableWidgetItem* item = ui->tableWidget->item(i,j); 
      out << item->data(Qt::DisplayRole).toString(); 
     } 
     out << "\n"; 
    } 
} 
+0

Vielen Dank. Es hat funktioniert und mir jetzt das richtige Ergebnis gegeben. –

1

nicht QDataStream für das Speichern von Textdateien anwenden. Verwenden Sie QTextStream. QDataStream verwenden Sie sein eigenes Serialisierungsformat, anstatt reinen Text zu schreiben.

Bei Strings sind die ersten zwei Bytes Länge, dann ist es Inhalt (2 Bytes pro Zeichen). Ihr "Müll" ist eine Länge jeder Zeichenfolge. Sie sehen nur ein Zeichen, weil Ihre Datei in Unicode ist.

+0

Danke Dmitry. Sie haben recht, wenn Sie sagen, dass der Müll eigentlich die Länge jeder Saite ist. –

Verwandte Themen