2014-12-08 3 views
3

Я написал код ниже для qt gui, чтобы просмотреть вывод запроса в QTableView (ориентированный на модель). теперь я хочу сохранить этот вывод как .csv или .txt файл. Были предложения по использованию QTableWidget (Item oriented), но я хотел бы придерживаться подхода, основанного на модели.Выход 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: ошибка: при оценке «operator + = (класс QWidgetData *, const char [2]) ' – RicoRicochet

+1

@AmarjitBiswas Были некоторые ошибки синтаксиса, и я только что их исправил. Попробуйте последнее обновление. – Tay2510

+1

эй это сработало чудесно .. спасибо тонну. – RicoRicochet

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

     }