diff --git a/panels/dock/taskmanager/rolecombinemodel.cpp b/panels/dock/taskmanager/rolecombinemodel.cpp index 1aec9bc5d..8bad47c2b 100644 --- a/panels/dock/taskmanager/rolecombinemodel.cpp +++ b/panels/dock/taskmanager/rolecombinemodel.cpp @@ -126,25 +126,30 @@ RoleCombineModel::RoleCombineModel(QAbstractItemModel* major, QAbstractItemModel // create minor role map auto minorRolenames = m_minor->roleNames(); - auto thisRoleNames = roleNames(); - std::for_each(minorRolenames.constBegin(), minorRolenames.constEnd(), [&minorRolenames, &thisRoleNames, this](auto &roleName){ - m_minorRolesMap.insert(thisRoleNames.key(roleName), minorRolenames.key(roleName)); + m_roleNames = createRoleNames(); + std::for_each(minorRolenames.constBegin(), minorRolenames.constEnd(), [&minorRolenames, this](auto &roleName) { + m_minorRolesMap.insert(m_roleNames.key(roleName), minorRolenames.key(roleName)); }); } -QHash RoleCombineModel::roleNames() const +QHash RoleCombineModel::createRoleNames() const { auto roleNames = sourceModel()->roleNames(); auto keys = sourceModel()->roleNames().keys(); auto lastRole = *(std::max_element(keys.constBegin(), keys.constEnd())); auto minorRoleNames = m_minor->roleNames().values(); - std::for_each(minorRoleNames.constBegin(), minorRoleNames.constEnd(), [&lastRole, &roleNames, this](auto &roleName){ + std::for_each(minorRoleNames.constBegin(), minorRoleNames.constEnd(), [&lastRole, &roleNames, this](auto &roleName) { roleNames.insert(++lastRole, roleName); }); return roleNames; } +QHash RoleCombineModel::roleNames() const +{ + return m_roleNames; +} + int RoleCombineModel::rowCount(const QModelIndex &parent) const { return sourceModel()->rowCount(); diff --git a/panels/dock/taskmanager/rolecombinemodel.h b/panels/dock/taskmanager/rolecombinemodel.h index 795de9fea..3aa34fdb4 100644 --- a/panels/dock/taskmanager/rolecombinemodel.h +++ b/panels/dock/taskmanager/rolecombinemodel.h @@ -33,6 +33,9 @@ class RoleCombineModel : public QAbstractProxyModel QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; +private: + QHash createRoleNames() const; + private: QAbstractItemModel* m_minor; @@ -40,4 +43,6 @@ class RoleCombineModel : public QAbstractProxyModel QMap ,QPair> m_indexMap; // Hash table map role in this model to role in origin model. QHash m_minorRolesMap; + + QHash m_roleNames; }; diff --git a/panels/dock/taskmanager/rolegroupmodel.cpp b/panels/dock/taskmanager/rolegroupmodel.cpp index 5bbc390f1..957361778 100644 --- a/panels/dock/taskmanager/rolegroupmodel.cpp +++ b/panels/dock/taskmanager/rolegroupmodel.cpp @@ -109,6 +109,9 @@ void RoleGroupModel::setSourceModel(QAbstractItemModel *model) int RoleGroupModel::rowCount(const QModelIndex &parent) const { + if (!sourceModel()) { + return 0; + } if (parent.isValid()) { auto list = m_rowMap.value(parent.row(), nullptr); return nullptr == list ? 0 : list->size();