csvmodelwriter.cpp
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 }