【问题标题】:Unwanted character in CSV file when serializing from QTableWidget从 QTableWidget 序列化时 CSV 文件中不需要的字符
【发布时间】:2016-10-20 09:55:49
【问题描述】:

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

我们将不胜感激。

【问题讨论】:

  • QString str(QString::null); - 这是什么?只需写QString str;。顺便说一句,有QTextStream 用于构建字符串的类。
  • 我先尝试了 String str。我的猜测是它正在获取一些垃圾值,所以后来将其更改为 QString str(QString::null) 以使用 null 初始化它

标签: c++ qt qt5 qtextstream qdatastream


【解决方案1】:

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

如果你需要写文本,你应该使用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";
    }
}

【讨论】:

  • 非常感谢。它有效,现在给了我正确的结果。
【解决方案2】:

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

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

【讨论】:

  • 谢谢德米特里。你说得对,垃圾实际上是每个字符串的长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多