csvmodelwriter.cpp raw

   1  // Copyright (c) 2011-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <qt/csvmodelwriter.h>
   6  
   7  #include <QAbstractItemModel>
   8  #include <QFile>
   9  #include <QTextStream>
  10  
  11  CSVModelWriter::CSVModelWriter(const QString& _filename, QObject* parent)
  12      : QObject(parent),
  13        filename(_filename)
  14  {
  15  }
  16  
  17  void CSVModelWriter::setModel(const QAbstractItemModel *_model)
  18  {
  19      this->model = _model;
  20  }
  21  
  22  void CSVModelWriter::addColumn(const QString &title, int column, int role)
  23  {
  24      Column col;
  25      col.title = title;
  26      col.column = column;
  27      col.role = role;
  28  
  29      columns.append(col);
  30  }
  31  
  32  static void writeValue(QTextStream &f, const QString &value)
  33  {
  34      QString escaped = value;
  35      escaped.replace('"', "\"\"");
  36      f << "\"" << escaped << "\"";
  37  }
  38  
  39  static void writeSep(QTextStream &f)
  40  {
  41      f << ",";
  42  }
  43  
  44  static void writeNewline(QTextStream &f)
  45  {
  46      f << "\n";
  47  }
  48  
  49  bool CSVModelWriter::write()
  50  {
  51      QFile file(filename);
  52      if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
  53          return false;
  54      QTextStream out(&file);
  55  
  56      int numRows = 0;
  57      if(model)
  58      {
  59          numRows = model->rowCount();
  60      }
  61  
  62      // Header row
  63      for(int i=0; i<columns.size(); ++i)
  64      {
  65          if(i!=0)
  66          {
  67              writeSep(out);
  68          }
  69          writeValue(out, columns[i].title);
  70      }
  71      writeNewline(out);
  72  
  73      // Data rows
  74      for(int j=0; j<numRows; ++j)
  75      {
  76          for(int i=0; i<columns.size(); ++i)
  77          {
  78              if(i!=0)
  79              {
  80                  writeSep(out);
  81              }
  82              QVariant data = model->index(j, columns[i].column).data(columns[i].role);
  83              writeValue(out, data.toString());
  84          }
  85          writeNewline(out);
  86      }
  87  
  88      file.close();
  89  
  90      return file.error() == QFile::NoError;
  91  }
  92