2016-10-20 11 views
1

QTableWidgetからデータを読み込み、CSVファイルに保存しようとしています。QTableWidgetからシリアル化する際に、CSVファイルの不要な文字

ファイルに保存された値は正しいですが、すべての行の最初の列には最初に不要な文字があります。保存したファイルは次のようになり

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

::私はQtの5.4.0を使用しています

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

は、ここに私のコードです。

ここにお手伝いいただければ幸いです。

+0

QString str(QString :: null); - これは何ですか? 'QString str;'と書くだけです。ちなみに、文字列を構築するための 'QTextStream'クラスがあります。 –

+0

まず、文字列strを試しました。私の推測では、いくつかのガーバッグ値を取得していたので、後でそれをQString str(QString :: null)に変更してヌルで初期化しました。 –

答えて

1

returnを使用して関数の実行を終了すると(最初のテストでelseを使用していない)、最初のelseは役に立たなくなります。

テキストを書く必要がある場合は、QDataStreamの代わりにQTextStreamを使用し、バイナリデータの読み書きを行うようにしてください。

なぜあなたのループに一時的なQStringを使用していますか?あなたは、ストリームを持って、それを使用する:

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

ありがとうございました。それは今働いて、私に正しい結果を与えてくれました。 –

1

テキストファイルを保存するためQDataStreamを使用しないでください。 QTextStreamを使用してください。 QDataStreamは、プレーンテキストを記述するのではなく、独自のシリアル化形式を使用します。

文字列の場合、最初の2バイトは長さですが、内容(2バイト/文字)です。あなたの "ゴミ"は各文字列の長さです。ファイルがユニコードのため、1つのcharしか表示されません。

+0

ドミトリーに感謝します。ごみは実際には各文字列の長さであると言うのは間違いありません。 –

関連する問題