[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