Added template class AutoTableModel for automatic table models based on
given list of QObject derived objects.print
							parent
							
								
									7755432484
								
							
						
					
					
						commit
						b7cfb8c39c
					
				@ -0,0 +1,101 @@
 | 
				
			|||||||
 | 
					#ifndef ODBTABLEMODEL_H
 | 
				
			||||||
 | 
					#define ODBTABLEMODEL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QAbstractTableModel>
 | 
				
			||||||
 | 
					#include <QSharedPointer>
 | 
				
			||||||
 | 
					#include <QMetaProperty>
 | 
				
			||||||
 | 
					#include <QModelIndex>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class T>
 | 
				
			||||||
 | 
					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<T> 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<T> 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<QSharedPointer<T> > list()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_list;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // QAbstractItemModel interface
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    QSharedPointer<T> itemFromIndex(const QModelIndex &index) const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_list.at(index.row());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void setItemToIndex(const QModelIndex &index, QSharedPointer<T> data)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_list.removeAt(index.row());
 | 
				
			||||||
 | 
					        m_list.insert(index.row(), data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        emit dataChanged(index, index);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void addRow(QSharedPointer<T> 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<QSharedPointer<T> > list)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_list = list;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QList<QSharedPointer<T> > m_list;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // ODBTABLEMODEL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue