diff --git a/panels/dock/taskmanager/abstractwindowmonitor.cpp b/panels/dock/taskmanager/abstractwindowmonitor.cpp index 7f526a05a..ae07623d3 100644 --- a/panels/dock/taskmanager/abstractwindowmonitor.cpp +++ b/panels/dock/taskmanager/abstractwindowmonitor.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2024 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -76,10 +76,15 @@ void AbstractWindowMonitor::requestWindowsView(const QModelIndexList &indexes) c QVariant AbstractWindowMonitor::data(const QModelIndex &index, int role) const { + if (!index.isValid()) + return QVariant(); + auto pos = index.row(); - if (pos >= m_trackedWindows.size()) + if (pos < 0 || pos >= m_trackedWindows.size()) + return QVariant(); + auto window = m_trackedWindows.value(pos, nullptr); + if (!window) return QVariant(); - auto window = m_trackedWindows[pos]; switch (role) { case TaskManager::WinIdRole: diff --git a/panels/dock/taskmanager/rolecombinemodel.cpp b/panels/dock/taskmanager/rolecombinemodel.cpp index 23b59eebf..bb5345180 100644 --- a/panels/dock/taskmanager/rolecombinemodel.cpp +++ b/panels/dock/taskmanager/rolecombinemodel.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2024 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -342,6 +342,10 @@ int RoleCombineModel::columnCount(const QModelIndex &parent) const QVariant RoleCombineModel::data(const QModelIndex &index, int role) const { + if (!index.isValid() || !sourceModel()) { + return QVariant(); + } + if (m_minorRolesMap.contains(role)) { auto majorKey = qMakePair(index.row(), index.column()); auto mapping = m_indexMap.value(majorKey, qMakePair(-1, -1)); @@ -355,7 +359,12 @@ QVariant RoleCombineModel::data(const QModelIndex &index, int role) const return m_minor->data(m_minor->index(row, column), m_minorRolesMap[role]); } else { - return sourceModel()->data(sourceModel()->index(index.row(), index.column()), role); + auto sourceIndex = sourceModel()->index(index.row(), index.column()); + if (!sourceIndex.isValid()) { + return QVariant(); + } + + return sourceModel()->data(sourceIndex, role); } } diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index 3ad7f76b8..0c64335f5 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -327,8 +327,11 @@ void TaskManager::handleWindowAdded(QPointer window) // TODO: remove below code and use use model replaced. QModelIndexList res; - if (m_activeAppModel) { - res = m_activeAppModel->match(m_activeAppModel->index(0, 0), TaskManager::WinIdRole, window->id()); + if (m_activeAppModel && m_activeAppModel->rowCount() > 0) { + auto startIndex = m_activeAppModel->index(0, 0); + if (startIndex.isValid()) { + res = m_activeAppModel->match(startIndex, TaskManager::WinIdRole, window->id()); + } } QSharedPointer desktopfile = nullptr;