【问题标题】:QTableView output save as .csv or .txtQTableView 输出另存为 .csv 或 .txt
【发布时间】:2015-02-05 19:34:00
【问题描述】:

我为 qt gui 编写了以下代码,以在 QTableView(面向模型)中查看查询输出。现在我想将此输出保存为 .csv 或 .txt 文件。有人建议使用 QTableWidget(面向项目),但我想坚持基于模型的方法。

void MainWindow::on_pushButton_clicked()
{
db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("host");
db.setDatabaseName("db");
db.setUserName("uid");
db.setPassword("pw");
db.setPort(port);

QString MyQuery = ui->lineEdit->text();

if (db.open())
{
    qDebug()<<QDateTime::currentDateTime()<<"QUERY DONE SUCCESSFULLY ";

    this->model=new QSqlQueryModel();
    model->setQuery(MyQuery);
    ui->tableView->setModel(model);

}
else
{
    qDebug()<<QDateTime::currentDateTime()<<"YOU FORGOT THE QUERY "<<db.lastError().text();
}

}

任何指导方针???

【问题讨论】:

    标签: c++ qt csv qt4 qtableview


    【解决方案1】:

    这是一种将 qtableview 导出到 csv 的方法,包括使用 qt 的列名

       void staticmethods::exportTableViewToCSV(QTableView *table) {
                QString filters("CSV files (*.csv);;All files (*.*)");
                QString defaultFilter("CSV files (*.csv)");
                QString fileName = QFileDialog::getSaveFileName(0, "Save file", QCoreApplication::applicationDirPath(),
                                   filters, &defaultFilter);
                QFile file(fileName);
    
                QAbstractItemModel *model =  table->model();
                if (file.open(QFile::WriteOnly | QFile::Truncate)) {
                    QTextStream data(&file);
                    QStringList strList;
                    for (int i = 0; i < model->columnCount(); i++) {
                        if (model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString().length() > 0)
                            strList.append("\"" + model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString() + "\"");
                        else
                            strList.append("");
                    }
                    data << strList.join(";") << "\n";
                    for (int i = 0; i < model->rowCount(); i++) {
                        strList.clear();
                        for (int j = 0; j < model->columnCount(); j++) {
    
                            if (model->data(model->index(i, j)).toString().length() > 0)
                                strList.append("\"" + model->data(model->index(i, j)).toString() + "\"");
                            else
                                strList.append("");
                        }
                        data << strList.join(";") + "\n";
                    }
                    file.close();
                }
    
            }
    

    【讨论】:

    • 请注意,虽然这调用了它的输出.csv,但它使用的分隔符是“;”...
    • 输出的 csv 文件将一行的所有列合并到一个单元格中,但我解释的是每一列占用一个单元格,所以我修改上面的代码,将 data &lt;&lt; strList.join(";") &lt;&lt; "\n"; 替换为 data &lt;&lt; strList.join(",") &lt;&lt; "\n";。跨度>
    【解决方案2】:

    您可以根据自己的实际需要定制:

    // [Collect model data to QString]
    QString textData;
    int rows = model->rowCount();
    int columns = model->columnCount();
    
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
    
                textData += model->data(model->index(i,j)).toString();
                textData += ", "      // for .csv file format
        }
        textData += "\n";             // (optional: for new line segmentation)
    }
    
    // [Save to file] (header file <QFile> needed)
    // .csv
    QFile csvFile("test.csv");    
    if(csvFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
    
        QTextStream out(&csvFile);
        out << textData;
    
        csvFile.close();
    } 
    
    // .txt
    QFile txtFile("test.txt");    
    if(txtFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
    
        QTextStream out(&txtFile);
        out << textData;
    
        txtFile.close();
    } 
    

    【讨论】:

    • 感谢您提供这个思考过程,我尝试使用它,但它在构建期间抛出了一些错误--- /usr/local/Trolltech/Qt-4.8.4/include/QtGui/ qwidget.h:812: 错误: 'QWidgetData* QWidget::data' 是私有的/home/aj/MY_QT_WORK/table_test/mainwindow.cpp:62: 错误: 在这个上下文中/home/aj/MY_QT_WORK/table_test/mainwindow.cpp :62: 错误: 'QWidgetData*' 和'const char [2]' 类型的无效操作数到二进制'operator+' /home/aj/MY_QT_WORK/table_test/mainwindow.cpp:62: 错误: 在评估'operator+=(类 QWidgetData*, const char [2])'
    • @AmarjitBiswas 有一些语法错误,我刚刚更正了它们。请尝试最新更新。
    • 反过来也可以吗??那是使用这个 .csv 或 .txt 来填充 QTableView ???任何 code-sn-p / documentation-link 都会非常有帮助。再次感谢。
    • @AmarjitBiswas 当然可以,但是无论是.csv 还是.txt,您都必须“解析”文件。换句话说,您必须确定顺序数据(例如.csv 文件)到QTableView 数据模型的映射方法。我建议您提出一个新问题并指定您的需求,因为相反的方法需要您首先确定文件格式。否则,回答太板了。
    • @AmarjitBiswas Ehh...我刚刚发现你问了一个类似的问题here,这有什么不同吗?
    【解决方案3】:

    您可以通过以下方式将模型保存到文本文件:

    QFile f( "table.txt" );
    if( f.open( QIODevice::WriteOnly ) )
    {
        QTextStream ts( &f );
        QStringList strList;
        for (int i=0; i<model->rowCount(); i++)
        {
            strList.clear();
    
            for (int j=0; j<model->columnCount(); j++)
                strList << model->data(model->index(i,j)).toString();
    
            ts << strList.join(" ") + "\n";
        }
        f.close();
    }
    

    这里的模型数据以空格分隔的每一行保存一行。如果您想用逗号等其他字符分隔它们,您可以将连接上的参数替换为:

    ts << strList.join(",") + "\n";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 2012-12-26
      • 2021-12-06
      • 2016-11-23
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多