从 QTableWidget 序列化时 CSV 文件中不需要的字符

Unwanted character in CSV file when serializing from QTableWidget

我正在尝试从 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。

如有任何帮助,我们将不胜感激。

如果你用return结束函数的执行,你一开始的else就没用了(你在第二次测试中没有使用else)。

如果你需要写文本,你应该使用 QTextStream 而不是 QDataStream,它被设计为 read/write 二进制数据。

为什么要在循环中使用临时 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";
    }
}

不要使用 QDataStream 来保存文本文件。使用 QTextStreamQDataStream 使用它自己的序列化格式而不是编写纯文本。

对于字符串,前两个字节是长度,然后是内容(每个字符 2 个字节)。您的 "garbage" 是每个字符串的长度。你只看到一个字符,因为你的文件是 unicode。