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