2016-10-20 5 views
1

J'essaie de lire les données d'un QTableWidget et de les enregistrer dans un fichier CSV.Caractère indésirable dans un fichier CSV lors de la sérialisation à partir de QTableWidget

Les valeurs enregistrées dans le fichier sont correctes, mais pour la première colonne de chaque ligne, il y a un caractère indésirable au début.

Voici mon 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; 
     } 
    } 
} 

Le fichier enregistré ressemble à ceci:

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

J'utilise Qt 5.4.0.

Toute aide ici serait grandement appréciée.

+0

'QString str (QString :: null);' - Qu'est-ce que c'est? Il suffit d'écrire 'QString str;'. En passant, il existe une classe 'QTextStream' pour construire des chaînes. –

+0

J'ai essayé String str en premier. Ma conjecture était qu'elle obtenait une certaine valeur de garbag plus tard changé en QString str (QString :: null) pour l'initialiser avec null –

Répondre

1

Votre else au début est inutile si vous utilisez return pour terminer l'exécution de la fonction (vous n'avez pas utilisé else dans le deuxième test).

Si vous devez écrire du texte, vous devez utiliser un QTextStream au lieu d'un QDataStream conçu pour lire/écrire des données binaires. Pourquoi utiliser un QString temporaire dans les boucles de votre choix? Vous avez un flux, utilisez:

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

Merci beaucoup. Cela a fonctionné et m'a donné le bon résultat maintenant. –

1

Ne pas utiliser QDataStream pour enregistrer des fichiers texte. Utilisez QTextStream. QDataStream utilise son propre format de sérialisation au lieu d'écrire du texte brut.

Pour les chaînes, les deux premiers octets sont de longueur, puis leur contenu (2 octets par caractère). Votre "poubelle" est une longueur de chaque chaîne. Vous ne voyez qu'un seul caractère car votre fichier est en Unicode.

+0

Merci Dmitry. Vous avez raison de dire que les déchets étaient en fait la longueur de chaque corde. –