// QXlsx // MIT License // https://github.com/j2doll/QXlsx // XlsxTableModel.cpp #include "XlsxTableModel.h" #include #include #include XlsxTableModel::XlsxTableModel(QList colTitle, QList data, QObject *parent) : QAbstractTableModel(parent) { // [1] set name of column for (int ic = 0; ic < colTitle.size() ; ic++ ) { QString strCol = colTitle.at(ic); m_colNames.append( strCol ); } m_roleCount = m_colNames.size(); // [2] set data for (int dc = 0; dc < data.size() ; dc++ ) { VLIST vList = data.at(dc); m_the_data.append( vList ); } } void XlsxTableModel::testData() { // test code // | 1 | 2 | 3 | col.count is 3. // |-------|----|-------| // | Alpha | 10 | 100.0 | row count is 4. // | Beta | 20 | 200.0 | // | Gamma | 30 | 300.0 | // | Delta | 40 | 400.0 | // set name of column m_colNames.append( QString( "COL1" ) ); m_colNames.append( QString( "COL2" ) ); m_colNames.append( QString( "COL3" ) ); m_roleCount = m_colNames.size(); // set data VLIST list1; list1.append(QVariant("Alpha")); list1.append(QVariant(10)); list1.append(QVariant(100.0)); m_the_data.append( list1 ); VLIST list2; list2.append(QVariant("Beta")); list2.append(QVariant(20)); list2.append(QVariant(200.0)); m_the_data.append( list2 ); VLIST list3; list3.append(QVariant("Gamma")); list3.append(QVariant(30)); list3.append(QVariant(300.0)); m_the_data.append( list3 ); VLIST list4; list4.append(QVariant("Delta")); list4.append(QVariant(40)); list4.append(QVariant(400.0)); m_the_data.append( list4 ); } int XlsxTableModel::rowCount(const QModelIndex& parent) const { Q_UNUSED(parent) return m_the_data.size(); } int XlsxTableModel::columnCount(const QModelIndex& parent) const { Q_UNUSED(parent) return m_roleCount; } QVariant XlsxTableModel::data(const QModelIndex& index, int role) const { // current column & row int col = index.column(); int row = index.row(); // check boudaries if ( col < 0 || columnCount() <= col || row < 0 || rowCount() <= row ) { qDebug() << "[Warning]" << " col=" << col << ", row=" << row; return QVariant(); } // Nominal case QVariant ret; int cmpRole; for (int ic = 0; ic < m_the_data.size() ; ic++) { if ( row == ic ) { QList vList = m_the_data.at(ic); for (int jc = 0; jc < vList.size() ; jc++ ) { int plusOneRole = (int)(Qt::UserRole); plusOneRole = plusOneRole + 1; cmpRole = plusOneRole + jc; if ( role == cmpRole ) { QVariant var = vList.at(jc); if ( ! var.isValid() ) var.setValue( QString("") ) ; if ( var.isNull() ) var.setValue( QString("") ) ; ret = var; } } } } qDebug() << "data: " << " col=" << col << ", row=" << row << ", role=" << role << ", cmpRole=" << cmpRole << ", value=" << ret.toString(); return ret; } QHash XlsxTableModel::roleNames() const { QHash roles; for ( int ic = 0 ; ic < m_roleCount ; ic++) { QString strRole = m_colNames.at(ic); int roleNo = (Qt::UserRole+1) + ic; roles.insert( roleNo, strRole.toLatin1() ); } return roles; } // Return ordered List of user-defined roles QStringList XlsxTableModel::customRoleNames() { QMap res; QHashIterator i(roleNames()); while ( i.hasNext() ) { i.next(); if ( i.key() > Qt::UserRole ) { res[ i.key() ] = i.value(); } } return res.values(); }