From e85f1654117619794f6edde2a73b0c90af15c83a Mon Sep 17 00:00:00 2001 From: keke <243768648@qq.com> Date: Wed, 8 Jun 2022 15:08:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=90=8E=E6=A6=82=E7=8E=87=E5=A5=94=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因时跨线程调用指针对象方法 --- appmanagerjob.cpp | 54 ----------------------------------- appmanagerjob.h | 11 ------- appmanagermodel.cpp | 25 ---------------- appmanagermodel.h | 11 ------- appmanagerwidget.cpp | 68 +++++++++++++++++++++++++------------------- appmanagerwidget.h | 3 +- pkgdownloaddlg.cpp | 6 ++-- pkgdownloaddlg.h | 2 +- 8 files changed, 44 insertions(+), 136 deletions(-) diff --git a/appmanagerjob.cpp b/appmanagerjob.cpp index 279986c..70a813f 100644 --- a/appmanagerjob.cpp +++ b/appmanagerjob.cpp @@ -94,7 +94,6 @@ AppManagerJob::AppManagerJob(QObject *parent) , m_downloadingFile(nullptr) , m_netManager(nullptr) , m_netReply(nullptr) - , m_listViewModel(nullptr) , m_pkgMonitor(nullptr) { m_downloadDirPath = QString("%1/Desktop/downloadedPkg").arg(QDir::homePath()); @@ -136,26 +135,6 @@ QList AppManagerJob::getSearchedAppInfoList() return appInfoList; } -QStandardItemModel *AppManagerJob::getListViewModel() -{ - QStandardItemModel *model = nullptr; - m_mutex.lock(); - model = m_listViewModel; - m_mutex.unlock(); - - return model; -} - -QList AppManagerJob::getShowingAppInfoList() -{ - QList appInfoList; - m_mutex.lock(); - appInfoList = m_showingAppInfoList; - m_mutex.unlock(); - - return appInfoList; -} - QString AppManagerJob::getDownloadDirPath() const { return m_downloadDirPath; @@ -363,17 +342,6 @@ void AppManagerJob::startSearchTask(const QString &text) Q_EMIT searchTaskFinished(); } -void AppManagerJob::createListViewMode(const QList &list) -{ - QStandardItemModel *model = getItemModelFromAppInfoList(list); - - m_mutex.lock(); - m_showingAppInfoList = list; - m_listViewModel = model; - m_mutex.unlock(); - Q_EMIT createListViewModeFinished(); -} - void AppManagerJob::uninstallPkg(const QString &pkgName) { QProcess *proc = new QProcess(this); @@ -951,28 +919,6 @@ qint64 AppManagerJob::getUrlFileSize(QString &url, int tryTimes) return size; } -QStandardItemModel *AppManagerJob::getItemModelFromAppInfoList(const QList &appInfoList) -{ - QStandardItemModel *model = new QStandardItemModel(this); - for (const AppInfo &info : appInfoList) { - QString appName = info.desktopInfo.appName; - if (appName.isEmpty()) { - appName = info.pkgName; - } - QStandardItem *item = new QStandardItem(appName); - if (!info.desktopInfo.themeIconName.isEmpty()) { - item->setIcon(QIcon::fromTheme(info.desktopInfo.themeIconName)); - } else { - item->setIcon(QIcon::fromTheme(APP_THEME_ICON_DEFAULT)); - } - - item->setData(info.pkgName, AM_LIST_VIEW_ITEM_DATA_ROLE_PKG_NAME); - model->appendRow(QList {item}); - } - - return model; -} - bool AppManagerJob::buildPkg(const AppInfo &info) { //// 1. 清空打包缓存目录文件 diff --git a/appmanagerjob.h b/appmanagerjob.h index 1163747..52a494e 100644 --- a/appmanagerjob.h +++ b/appmanagerjob.h @@ -34,8 +34,6 @@ public: QMap getAppInfosMap(); QList getSearchedAppInfoList(); - QStandardItemModel *getListViewModel(); - QList getShowingAppInfoList(); QString getDownloadDirPath() const; QString getPkgBuildDirPath() const; @@ -52,8 +50,6 @@ public Q_SLOTS: // 开始搜索任务 void startSearchTask(const QString &text); - // 创建列表数据模型 - void createListViewMode(const QList &list); void uninstallPkg(const QString &pkgName); void installOhMyDDE(); @@ -74,8 +70,6 @@ Q_SIGNALS: // 搜索任务完成 void searchTaskFinished(); - // 创建列表数据模型完成 - void createListViewModeFinished(); void uninstallPkgFinished(const QString &pkgName); // 构建安装包任务完成 @@ -111,8 +105,6 @@ private: qint64 getUrlFileSize(QString &url, int tryTimes = 3); - // 由应用信息列表获得标准单元数据类 - QStandardItemModel *getItemModelFromAppInfoList(const QList &appInfoList); // 构建安装包任务 bool buildPkg(const AM::AppInfo &info); // 安全本地软件包 @@ -132,9 +124,6 @@ private: QString m_downloadingFileOriginUrl; QList m_searchedAppInfoList; - // 当前正在使用的列表数据模型 - QStandardItemModel *m_listViewModel; - QList m_showingAppInfoList; // deb构建缓存目录 QString m_pkgBuildCacheDirPath; // deb构建目录 diff --git a/appmanagermodel.cpp b/appmanagermodel.cpp index d01f3c9..330c3e3 100644 --- a/appmanagermodel.cpp +++ b/appmanagermodel.cpp @@ -63,31 +63,11 @@ QString AppManagerModel::formatePkgInfo(const PkgInfo &info) return text; } -void AppManagerModel::setShowingAppInfo(const AM::AppInfo &info) -{ - m_showingAppInfo = info; -} - -AppInfo AppManagerModel::getShowingAppInfo() -{ - return m_showingAppInfo; -} - QList AppManagerModel::getSearchedAppInfoList() const { return m_appManagerJob->getSearchedAppInfoList(); } -QStandardItemModel *AppManagerModel::getListViewModel() -{ - return m_appManagerJob->getListViewModel(); -} - -QList AppManagerModel::getShowingAppInfoList() const -{ - return m_appManagerJob->getShowingAppInfoList(); -} - void AppManagerModel::openStoreAppDetailPage(const QString &pkgName) { QProcess proc; @@ -279,11 +259,6 @@ void AppManagerModel::initConnection() Q_EMIT this->searchTaskFinished(); }); - connect(this, &AppManagerModel::notifyThreadCreateListViewMode, m_appManagerJob, &AppManagerJob::createListViewMode); - connect(m_appManagerJob, &AppManagerJob::createListViewModeFinished, this, [this]() { - Q_EMIT this->createListViewModeFinished(); - }); - connect(this, &AppManagerModel::notifyThreadUninstallPkg, m_appManagerJob, &AppManagerJob::uninstallPkg); connect(m_appManagerJob, &AppManagerJob::uninstallPkgFinished, this, [](const QString &pkgName) { qInfo() << pkgName << "uninstalled"; diff --git a/appmanagermodel.h b/appmanagermodel.h index d41a2dd..9f9a401 100644 --- a/appmanagermodel.h +++ b/appmanagermodel.h @@ -23,12 +23,7 @@ public: QList getAppInfosList(); QString formatePkgInfo(const AM::PkgInfo &info); - void setShowingAppInfo(const AM::AppInfo &info); - AM::AppInfo getShowingAppInfo(); - QList getSearchedAppInfoList() const; - QStandardItemModel *getListViewModel(); - QList getShowingAppInfoList() const; void openStoreAppDetailPage(const QString &pkgName); void openSpkStoreAppDetailPage(const QString &pkgName); @@ -52,10 +47,6 @@ Q_SIGNALS: void notifyThreadStartSearchTask(const QString &text); // 搜索任务完成 void searchTaskFinished(); - // 通知创建列表数据模型 - void notifyThreadCreateListViewMode(const QList &list); - // 创建列表数据模型完成 - void createListViewModeFinished(); // 通知卸载包 void notifyThreadUninstallPkg(const QString &pkgName); // 通知构建安装包 @@ -87,8 +78,6 @@ private: void postInit(); private: - AM::AppInfo m_showingAppInfo; - AppManagerJob *m_appManagerJob; QThread *m_appManagerJobThread; }; diff --git a/appmanagerwidget.cpp b/appmanagerwidget.cpp index f97737d..4099468 100644 --- a/appmanagerwidget.cpp +++ b/appmanagerwidget.cpp @@ -316,7 +316,7 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) // 在线获取安装包 connect(getPkgFromSrvBtn, &QPushButton::clicked, this, [this](bool) { - PkgDownloadDlg *dlg = new PkgDownloadDlg(m_model, this); + PkgDownloadDlg *dlg = new PkgDownloadDlg(m_showingAppInfo, m_model, this); dlg->show(); }); @@ -371,7 +371,6 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) }); connect(m_model, &AppManagerModel::searchTaskFinished, this, &AppManagerWidget::onSearchTaskFinished); - connect(m_model, &AppManagerModel::createListViewModeFinished, this, &AppManagerWidget::onCreateListViewModeFinished); // 包安装变动 connect(m_model, &AppManagerModel::appInstalled, this, &AppManagerWidget::onAppInstalled); @@ -403,9 +402,6 @@ void AppManagerWidget::showAppInfo(const AppInfo &info) } } - - m_model->setShowingAppInfo(m_showingAppInfo); - const QString themeIconName = m_showingAppInfo.desktopInfo.themeIconName; if (!themeIconName.isEmpty()) { m_appAbstractLabel->setPixmap(QIcon::fromTheme(themeIconName).pixmap(40, 40)); @@ -457,27 +453,6 @@ void AppManagerWidget::onSearchTaskFinished() Q_EMIT m_filterMenu->triggered(m_showSearchedAppAction); } -void AppManagerWidget::onCreateListViewModeFinished() -{ - QStandardItemModel *model = m_model->getListViewModel(); - m_appListView->setModel(model); - - if (nullptr != m_appListModel) { - m_appListModel->deleteLater(); - m_appListModel = model; - } - - m_showingInfoList = m_model->getShowingAppInfoList(); - - if (!m_showingInfoList.isEmpty()) { - m_appListView->setCurrentIndex(m_appListModel->index(0, 0)); - showAppInfo(m_showingInfoList[0]); - } - - // 更新应用个数标签 - updateAppCountLabel(); -} - void AppManagerWidget::onAppInstalled(const AM::AppInfo &appInfo) { for (QList::iterator iter = m_appInfoList.begin(); @@ -716,10 +691,43 @@ QString AppManagerWidget::formateAppInfo(const AppInfo &info) return text; } +void AppManagerWidget::setItemModelFromAppInfoList(const QList &appInfoList) +{ + // 更新正在显示的应用列表 + m_showingInfoList = appInfoList; + + if (!m_showingInfoList.isEmpty()) { + m_appListView->setCurrentIndex(m_appListModel->index(0, 0)); + showAppInfo(m_showingInfoList[0]); + } + + // 更新应用个数标签 + updateAppCountLabel(); + + // 先清空数据 + m_appListModel->removeRows(0, m_appListModel->rowCount()); + + for (const AppInfo &info : appInfoList) { + QString appName = info.desktopInfo.appName; + if (appName.isEmpty()) { + appName = info.pkgName; + } + QStandardItem *item = new QStandardItem(appName); + if (!info.desktopInfo.themeIconName.isEmpty()) { + item->setIcon(QIcon::fromTheme(info.desktopInfo.themeIconName)); + } else { + item->setIcon(QIcon::fromTheme(APP_THEME_ICON_DEFAULT)); + } + + item->setData(info.pkgName, AM_LIST_VIEW_ITEM_DATA_ROLE_PKG_NAME); + m_appListModel->appendRow(QList {item}); + } +} + void AppManagerWidget::showAllAppInfoList() { m_displayRangeType = All; - Q_EMIT m_model->notifyThreadCreateListViewMode(m_appInfoList); + setItemModelFromAppInfoList(m_appInfoList); } void AppManagerWidget::onlyShowInstalledAppInfoList() @@ -733,7 +741,7 @@ void AppManagerWidget::onlyShowInstalledAppInfoList() installedAppInfoList.append(info); } - Q_EMIT m_model->notifyThreadCreateListViewMode(installedAppInfoList); + setItemModelFromAppInfoList(installedAppInfoList); } void AppManagerWidget::onlyShowUIAppInfoList() @@ -747,7 +755,7 @@ void AppManagerWidget::onlyShowUIAppInfoList() uiAppInfoList.append(info); } - Q_EMIT m_model->notifyThreadCreateListViewMode(uiAppInfoList); + setItemModelFromAppInfoList(uiAppInfoList); } void AppManagerWidget::showSearchedAppInfoList() @@ -755,7 +763,7 @@ void AppManagerWidget::showSearchedAppInfoList() m_displayRangeType = Searched; QList searchedList = m_model->getSearchedAppInfoList(); - Q_EMIT m_model->notifyThreadCreateListViewMode(searchedList); + setItemModelFromAppInfoList(searchedList); } void AppManagerWidget::setLoading(bool loading) diff --git a/appmanagerwidget.h b/appmanagerwidget.h index 79ba543..422ff24 100644 --- a/appmanagerwidget.h +++ b/appmanagerwidget.h @@ -44,7 +44,6 @@ public Q_SLOTS: void showAppFileList(const AM::AppInfo &info); void onSearchEditingFinished(); void onSearchTaskFinished(); - void onCreateListViewModeFinished(); // 软件安装变动 void onAppInstalled(const AM::AppInfo &appInfo); void onAppUpdated(const AM::AppInfo &appInfo); @@ -53,6 +52,8 @@ public Q_SLOTS: private: QString formateAppInfo(const AM::AppInfo &info); + // 根据应用信息列表设置标准单元数据对象数据 + void setItemModelFromAppInfoList(const QList &appInfoList); void showAllAppInfoList(); void onlyShowInstalledAppInfoList(); void onlyShowUIAppInfoList(); diff --git a/pkgdownloaddlg.cpp b/pkgdownloaddlg.cpp index b2a8aaa..41c8d2f 100644 --- a/pkgdownloaddlg.cpp +++ b/pkgdownloaddlg.cpp @@ -18,10 +18,10 @@ using namespace AM; -PkgDownloadDlg::PkgDownloadDlg(AppManagerModel *model, QWidget *parent) +PkgDownloadDlg::PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *model, QWidget *parent) : DFrame(parent) , m_model(model) - , m_showingAppInfo(m_model->getShowingAppInfo()) + , m_showingAppInfo(appInfo) , m_centralWidgetBlurBg(nullptr) , m_titlebar(nullptr) , m_versionSelectMenu(nullptr) @@ -51,7 +51,7 @@ PkgDownloadDlg::PkgDownloadDlg(AppManagerModel *model, QWidget *parent) setLayout(mainLayout); m_titlebar = new DTitlebar(this); - m_titlebar->setIcon(QIcon::fromTheme("chromium-app-list")); + m_titlebar->setIcon(QIcon(":/icons/deepin/builtin/icons/grid_48px.svg")); m_titlebar->setTitle("应用管理器"); m_titlebar->setFixedHeight(40); m_titlebar->setBackgroundTransparent(true); diff --git a/pkgdownloaddlg.h b/pkgdownloaddlg.h index ca66dc3..ed8cfb0 100644 --- a/pkgdownloaddlg.h +++ b/pkgdownloaddlg.h @@ -23,7 +23,7 @@ class PkgDownloadDlg : public DFrame { Q_OBJECT public: - explicit PkgDownloadDlg(AppManagerModel *model, QWidget *parent = nullptr); + explicit PkgDownloadDlg(const AM::AppInfo &appInfo, AppManagerModel *model, QWidget *parent = nullptr); virtual ~PkgDownloadDlg() override; protected: -- Gitee