1

からデータを読み取り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;
         }
    }
}

保存されたファイルは次のようになります。

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

Qt 5.4.0 を使用しています。

ここで何か助けていただければ幸いです。

4

2 に答える 2

1

関数の実行を終了するためにelse使用する場合、最初は役に立ちません( 2番目のテストでは使用しませんでした)。returnelse

テキストを書き込む必要がある場合は、バイナリ データの読み取り/書き込み用に設計された のQTextStream代わりに を使用する必要があります。QDataStream

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";
    }
}
于 2016-10-20T10:41:40.307 に答える