Wladimir J. van der Laan
14 years ago
13 changed files with 230 additions and 13 deletions
@ -0,0 +1,83 @@ |
|||||||
|
#include "csvmodelwriter.h" |
||||||
|
|
||||||
|
#include <QAbstractItemModel> |
||||||
|
#include <QFile> |
||||||
|
#include <QTextStream> |
||||||
|
|
||||||
|
CSVModelWriter::CSVModelWriter(const QString &filename, QObject *parent) : |
||||||
|
QObject(parent), |
||||||
|
filename(filename) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void CSVModelWriter::setModel(const QAbstractItemModel *model) |
||||||
|
{ |
||||||
|
this->model = model; |
||||||
|
} |
||||||
|
|
||||||
|
void CSVModelWriter::addColumn(const QString &title, int column, int role) |
||||||
|
{ |
||||||
|
Column col; |
||||||
|
col.title = title; |
||||||
|
col.column = column; |
||||||
|
col.role = role; |
||||||
|
|
||||||
|
columns.append(col); |
||||||
|
} |
||||||
|
|
||||||
|
static void writeValue(QTextStream &f, const QString &value) |
||||||
|
{ |
||||||
|
// TODO: quoting if " or \n in string
|
||||||
|
f << "\"" << value << "\""; |
||||||
|
} |
||||||
|
|
||||||
|
static void writeSep(QTextStream &f) |
||||||
|
{ |
||||||
|
f << ","; |
||||||
|
} |
||||||
|
|
||||||
|
static void writeNewline(QTextStream &f) |
||||||
|
{ |
||||||
|
f << "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
bool CSVModelWriter::write() |
||||||
|
{ |
||||||
|
QFile file(filename); |
||||||
|
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) |
||||||
|
return false; |
||||||
|
QTextStream out(&file); |
||||||
|
|
||||||
|
int numRows = model->rowCount(); |
||||||
|
|
||||||
|
// Header row
|
||||||
|
for(int i=0; i<columns.size(); ++i) |
||||||
|
{ |
||||||
|
if(i!=0) |
||||||
|
{ |
||||||
|
writeSep(out); |
||||||
|
} |
||||||
|
writeValue(out, columns[i].title); |
||||||
|
} |
||||||
|
writeNewline(out); |
||||||
|
|
||||||
|
// Data rows
|
||||||
|
for(int j=0; j<numRows; ++j) |
||||||
|
{ |
||||||
|
for(int i=0; i<columns.size(); ++i) |
||||||
|
{ |
||||||
|
if(i!=0) |
||||||
|
{ |
||||||
|
writeSep(out); |
||||||
|
} |
||||||
|
QVariant data = model->index(j, columns[i].column).data(columns[i].role); |
||||||
|
writeValue(out, data.toString()); |
||||||
|
} |
||||||
|
writeNewline(out); |
||||||
|
} |
||||||
|
|
||||||
|
file.close(); |
||||||
|
|
||||||
|
return file.error() == QFile::NoError; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,43 @@ |
|||||||
|
#ifndef CSVMODELWRITER_H |
||||||
|
#define CSVMODELWRITER_H |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
#include <QList> |
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE |
||||||
|
class QAbstractItemModel; |
||||||
|
QT_END_NAMESPACE |
||||||
|
|
||||||
|
// Export TableModel to CSV file
|
||||||
|
class CSVModelWriter : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
public: |
||||||
|
explicit CSVModelWriter(const QString &filename, QObject *parent = 0); |
||||||
|
|
||||||
|
void setModel(const QAbstractItemModel *model); |
||||||
|
void addColumn(const QString &title, int column, int role=Qt::EditRole); |
||||||
|
|
||||||
|
// Perform write operation
|
||||||
|
// Returns true on success, false otherwise
|
||||||
|
bool write(); |
||||||
|
|
||||||
|
private: |
||||||
|
QString filename; |
||||||
|
const QAbstractItemModel *model; |
||||||
|
|
||||||
|
struct Column |
||||||
|
{ |
||||||
|
QString title; |
||||||
|
int column; |
||||||
|
int role; |
||||||
|
}; |
||||||
|
QList<Column> columns; |
||||||
|
|
||||||
|
signals: |
||||||
|
|
||||||
|
public slots: |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
#endif // CSVMODELWRITER_H
|
Loading…
Reference in new issue