Check the roles after a row is added for a model with no roles intially

Fixes #13
This commit is contained in:
Pierre-Yves Siret 2017-01-08 22:49:07 +01:00
parent edf53b56ef
commit a3d95d2290
2 changed files with 17 additions and 0 deletions

View File

@ -194,6 +194,13 @@ bool QQmlSortFilterProxyModel::lessThan(const QModelIndex& source_left, const QM
return source_left.row() < source_right.row();
}
void QQmlSortFilterProxyModel::resetInternalData()
{
QSortFilterProxyModel::resetInternalData();
if (roleNames().isEmpty()) // workaround for when a model has no roles and roles are added when the model is populated (ListModel)
connect(this, &QAbstractItemModel::rowsAboutToBeInserted, this, &QQmlSortFilterProxyModel::initRoles);
}
void QQmlSortFilterProxyModel::invalidateFilter()
{
if (m_completed)
@ -231,6 +238,12 @@ void QQmlSortFilterProxyModel::updateRoles()
updateSortRole();
}
void QQmlSortFilterProxyModel::initRoles()
{
disconnect(this, &QAbstractItemModel::rowsAboutToBeInserted, this , &QQmlSortFilterProxyModel::initRoles);
resetInternalData();
}
QVariantMap QQmlSortFilterProxyModel::modelDataMap(const QModelIndex& modelIndex) const
{
QVariantMap map;

View File

@ -84,12 +84,16 @@ protected:
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;
bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override;
protected Q_SLOTS:
void resetInternalData();
private Q_SLOTS:
void invalidateFilter();
void invalidate();
void updateFilterRole();
void updateSortRole();
void updateRoles();
void initRoles();
private:
QVariantMap modelDataMap(const QModelIndex& modelIndex) const;