#ifndef ODBTABLEMODEL_H #define ODBTABLEMODEL_H #include #include #include #include template class AutoTableModel : public QAbstractTableModel { public: explicit AutoTableModel(QObject *parent = NULL) :QAbstractTableModel(parent) { } virtual ~AutoTableModel() {} // QAbstractItemModel interface public: int rowCount(const QModelIndex &parent = QModelIndex()) const { return m_list.size(); } int columnCount(const QModelIndex &parent = QModelIndex()) const { if (m_list.isEmpty()) { return 0; } QSharedPointer entity = m_list.at(0); QObject *rawEntity = (QObject*)entity.data(); return rawEntity->metaObject()->propertyCount() - 1; } QVariant data(const QModelIndex &index, int role) const { if (role == Qt::DisplayRole) { QSharedPointer entity = m_list.at(index.row()); QObject *rawEntity = (QObject*)entity.data(); return rawEntity->property(rawEntity->metaObject()->property(index.column() + 1).name()); } return QVariant::Invalid; } QList > list() { return m_list; } // QAbstractItemModel interface public: QSharedPointer itemFromIndex(const QModelIndex &index) const { return m_list.at(index.row()); } void setItemToIndex(const QModelIndex &index, QSharedPointer data) { m_list.removeAt(index.row()); m_list.insert(index.row(), data); emit dataChanged(index, index); } void addRow(QSharedPointer data) { beginInsertRows(QModelIndex(), rowCount() - 1, rowCount() - 1); insertRow(rowCount()); m_list.append(data); endInsertRows(); } void removeRowAt(const QModelIndex &index) { beginRemoveRows(QModelIndex(), index.row(), index.row()); removeRow(index.row()); m_list.removeAt(index.row()); endRemoveRows(); } void setData(QList > list) { m_list = list; } private: QList > m_list; }; #endif // ODBTABLEMODEL_H