1

我正在尝试从 a 读取数据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如果您使用 to 结束函数的执行(您在第二次测试中没有使用),那么您一开始是没有用的returnelse

如果你需要写文本,你应该使用 aQTextStream而不是 aQDataStream来读取/写入二进制数据。

为什么在你的循环中使用临时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 回答
1

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

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

于 2016-10-20T10:52:17.877 回答