Wladimir J. van der Laan
14 years ago
13 changed files with 230 additions and 13 deletions
@ -0,0 +1,83 @@
@@ -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 @@
@@ -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