2014-12-08 45 views
3

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

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(); 
} 

}

任何指引???

回答

7

您可以根据自己的实际需求进行定制:

// [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(); 
} 
+1

感谢您提供这个思考过程,我试图使用这个,但它在编译时抛出一些错误--- /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]'的无效操作数到二元运算符+' /home/aj/MY_QT_WORK/table_test/mainwindow .cpp:62:error:在评估'operator + =(class QWidgetData *,const char [2])' – RicoRicochet 2014-12-08 07:41:08

+1

@AmarjitBiswas有一些语法错误,我刚纠正它们。请尝试最新的更新。 – Tay2510 2014-12-08 07:42:33

+1

嘿,这工作很好..谢谢一吨.. – RicoRicochet 2014-12-08 07:46:57

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"; 
0

这里是一个QTableView中导出为CSV,包括列名

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"; 
       } 
       data << strList.join(";") << "\n"; 
       file.close(); 
      } 

     } 
方式