[SailfishDevel] Build a Model with "fixed" items + "dynamic" ones

François K. daitheflu at free.fr
Mon Apr 20 09:28:40 UTC 2015


Hi Nils,

Wow, thanks *a lot* !

I totally overlooked the user of QAbstractProxyModel. This could definitely help if I choose n°1 idea.
I'd still have to figure out how to deal with the refreshing part, but that's a strong way to get started.

Thanks a lot, I wasn't asking for so much stuff/code :)

(Would you mind if I put your names in the credits (Lucien, Michael, Peter, Nils) ?)

-- 
François


----- Mail original -----
> Hi,
> 
> On Fri, Apr 17, 2015 at 12:09 PM, François K. <daitheflu at free.fr>
> wrote:
> > 1/ The first one is to build a Model that would inherit from
> > QAbstractListModel.
> > In the constructor, I would add the first 6 items (hard-code them).
> 
> maybe this code can give you some inspiration to solve at least some
> part of your problem:
> 
> -------------- prefixmodel.h
> 
> #ifndef PREFIXMODEL_h
> #define PREFIXMODEL_h
> 
> #include <QAbstractProxyModel>
> 
> class RealModel;
> 
> class PrefixModel : public QAbstractProxyModel
> {
>   Q_OBJECT
> 
> public:
> 
>   explicit PrefixModel(QObject *parent = 0);
> 
>   int rowCount(const QModelIndex &parent = QModelIndex()) const;
>   int columnCount(const QModelIndex &parent) const { return 1; }
>   QModelIndex parent(const QModelIndex &) const { return
>   QModelIndex(); }
>   QModelIndex index(int row, int column, const QModelIndex &parent =
> QModelIndex()) const;
> 
>   QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;
>   QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
> 
>   void setRealModel(RealModel *sourceModel)
> 
> private slots:
> 
>   void sourceRowsInserted(const QModelIndex &, int, int);
>   void sourceRowsRemoved(const QModelIndex &, int, int);
>   void sourceRowsAboutToBeInserted(const QModelIndex &, int, int);
>   void sourceRowsAboutToBeRemoved(const QModelIndex &, int, int);
>   void sourceReset();
>   QVariant data(const QModelIndex &proxyIndex, int role) const;
> };
> 
> #endif // PREFIXMODEL_h
> 
> -------------- prefixmodel.cpp
> 
> #include "prefixmodel.h"
> #incldue "realmodel.h"
> 
> #define FIX_ITEMS 6
> 
> PrefixModel::PrefixModel(QObject *parent) :
>   QAbstractProxyModel(parent)
> {
> }
> 
> QModelIndex PrefixModel::mapFromSource(const QModelIndex
> &sourceIndex) const
> {
>   return sourceModel()->index(sourceIndex.row() + FIX_ITEMS,
> sourceIndex.column());
> }
> 
> QModelIndex PrefixModel::mapToSource(const QModelIndex &proxyIndex)
> const
> {
>   if (!sourceModel())
>     return QModelIndex();
> 
>   return sourceModel()->index(proxyIndex.row() - FIX_ITEMS,
> proxyIndex.column());
> }
> 
> QVariant PrefixModel::data(const QModelIndex &proxyIndex, int role)
> const
> {
>   if (proxyIndex.row() < FIX_ITEMS) {
>     if (role == Qt::DisplayRole)
>       return QString("fix item #%1").arg(proxyIndex.row());
> 
>     return QVariant();
>   }
>   return QAbstractProxyModel::data(proxyIndex, role);
> }
> 
> int PrefixModel::rowCount(const QModelIndex &parent) const
> {
>   if (!sourceModel())
>     return 0;
> 
>   return sourceModel()->rowCount(parent) + FIX_ITEMS;
> }
> 
> QModelIndex PrefixModel::index(int row, int column, const QModelIndex
> &parent) const
> {
>   return createIndex(row, column, 0);
> }
> 
> void PrefixModel::setRealModel(RealModel *sourceModel)
> {
>   if (this->sourceModel() == sourceModel)
>     return;
> 
>   if (this->sourceModel())
>     this->sourceModel()->disconnect(this);
> 
>   QAbstractProxyModel::setSourceModel(sourceModel);
>   emit sourceModelChanged();
> 
>   connect(sourceModel,
> SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), this,
> SLOT(sourceRowsAboutToBeInserted(QModelIndex,int,int)));
>   connect(sourceModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
> this, SLOT(sourceRowsInserted(QModelIndex,int,int)));
>   connect(sourceModel,
> SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), this,
> SLOT(sourceRowsAboutToBeRemoved(QModelIndex,int,int)));
>   connect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
>   this,
> SLOT(sourceRowsRemoved(QModelIndex,int,int)));
>   connect(sourceModel, SIGNAL(modelReset()), this,
>   SLOT(sourceReset()));
> }
> 
> RealModel *PrefixModel::sourceModelInternal() const
> {
>   return
>   qobject_cast<RealModel*>(QAbstractProxyModel::sourceModel());
> }
> 
> void PrefixModel::sourceRowsInserted(const QModelIndex &, int start,
> int end)
> {
>   endInsertRows();
> }
> 
> void PrefixModel::sourceRowsRemoved(const QModelIndex &, int start,
> int end)
> {
>   endRemoveRows();
> }
> 
> void PrefixModel::sourceRowsAboutToBeInserted(const QModelIndex &,
> int
> start, int end)
> {
>   beginInsertRows(QModelIndex(), start + FIX_ITEMS, end + FIX_ITEMS);
> }
> 
> void PrefixModel::sourceRowsAboutToBeRemoved(const QModelIndex &, int
> start, int end)
> {
>   beginRemoveRows(QModelIndex(), start + FIX_ITEMS, end + FIX_ITEMS);
> }
> 
> void PrefixModel::sourceReset()
> {
>   beginResetModel();
>   endResetModel();
> }
> 
> Nils
> _______________________________________________
> SailfishOS.org Devel mailing list
> To unsubscribe, please send a mail to
> devel-unsubscribe at lists.sailfishos.org


More information about the Devel mailing list