From b86b19e91d7f9793700b0b92e01143ac7d18fc93 Mon Sep 17 00:00:00 2001 From: Krad Date: Thu, 21 Jul 2022 10:39:24 +0800 Subject: [PATCH] Refactor DialogManager.3 --- src/dialogs/DialogManager.cpp | 73 ++++++++++++++++++--------- src/dialogs/DialogManager.h | 7 ++- src/forms/select/SelectFormWidget.cpp | 8 +-- 3 files changed, 57 insertions(+), 31 deletions(-) diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index eaf4a7d..7fe5d77 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "event/EventCenter.h" #include "dialogs/GUIMessageDialog.h" @@ -21,6 +22,7 @@ DialogManager::DialogManager() : QObject() , mFunctionDialog(nullptr) , mMessageDialog(nullptr) +, topWidget(nullptr) { } @@ -33,9 +35,32 @@ void DialogManager::init() { connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd); } -QWidget *DialogManager::getTopWidget() { - if (!topWidgetStore.isEmpty()) return topWidgetStore.top(); - return QApplication::activeWindow(); +//得考虑多线程的问题 +void DialogManager::setTopWidget(QWidget* widget) { + std::lock_guard lockGuard(mutex); + if (!topWidget&& QApplication::activeWindow()){ + topWidget = QApplication::activeWindow(); + } + qDebug()<<"last top:"<objectName()<<", new top:"<objectName(); + widget->setParent(topWidget,widget->windowFlags()); + topWidget = widget; + ++mDialogCount; +} + +void DialogManager::releaseTopWidget(QWidget* expectedTopWidget) { + std::lock_guard lockGuard(mutex); + if (topWidget == expectedTopWidget){ + topWidget = expectedTopWidget->parentWidget(); + } + else{ + while (auto tempWidget = topWidget->parentWidget()){ + if (tempWidget->parentWidget() == expectedTopWidget){ + tempWidget->setParent(expectedTopWidget->parentWidget()); + break; + } + } + } + --mDialogCount; } void DialogManager::requestLogin() @@ -44,57 +69,59 @@ void DialogManager::requestLogin() if (!mFunctionDialog){ mFunctionDialog = new LoginDialog; } + mFunctionDialog->setWindowModality(Qt::WindowModal); mFunctionDialog->exec(); while (QDialog::Accepted != mFunctionDialog->result()) { + mFunctionDialog->exec(); } } int DialogManager::requestAddAccount(QSqlTableModel* model) { - AccountFormDialog dialog(getTopWidget(), New); - topWidgetStore.push(&dialog); + AccountFormDialog dialog(nullptr, New); + setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); dialog.setReferenceModel(model); int ret = dialog.exec(); - topWidgetStore.pop(); + releaseTopWidget(&dialog); return ret; } int DialogManager::requestEditSelfAccount() { - AccountFormDialog dialog(getTopWidget(), Self); - topWidgetStore.push(&dialog); + AccountFormDialog dialog(nullptr, Self); + setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); - topWidgetStore.pop(); + releaseTopWidget(&dialog); return ret; } int DialogManager::requestEditAdminAccount(const QMap& values) { - AccountFormDialog dialog(getTopWidget(), Admin); - topWidgetStore.push(&dialog); + AccountFormDialog dialog(nullptr, Admin); + setTopWidget(&dialog); dialog.setAccountInformation(values); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); - topWidgetStore.pop(); + releaseTopWidget(&dialog); return ret; } void DialogManager::requestChangePassword() { - ChangePasswordFormDialog dialog(getTopWidget()); - topWidgetStore.push(&dialog); - dialog.setGeometry(getTopWidget()->geometry()); + ChangePasswordFormDialog dialog; + setTopWidget(&dialog); + dialog.setGeometry(dialog.parentWidget()->geometry()); dialog.setWindowModality(Qt::WindowModal); dialog.exec(); - topWidgetStore.pop(); + releaseTopWidget(&dialog); } //考虑以后使用另外的dialog显示错误 void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { - if (!this->getTopWidget()->isVisible()) return; clearMessageDialog(); //new dialog - auto dialog = new GUIMessageDialog(this->getTopWidget()); + auto dialog = new GUIMessageDialog; + if (msg) { QString *str = (QString *) msg; dialog->showMessage(*str); @@ -103,11 +130,11 @@ void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { } dialog->stopLoading(); dialog->showExitButton(); - topWidgetStore.push(dialog); + setTopWidget(dialog); dialog->setWindowModality(Qt::NonModal); dialog->exec(); - auto lastDialog = topWidgetStore.pop(); - lastDialog->deleteLater(); + releaseTopWidget(dialog); + dialog->deleteLater(); } // 扫描过程 dialog 只能为最底层,并且会被error dialog 清除! @@ -115,9 +142,9 @@ void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) { //没有目标parent 撤销操作 if (!QApplication::activeWindow()) return; //只能在最底层窗口上模态 - if (!topWidgetStore.isEmpty()) return; + if (mDialogCount>0) return; clearMessageDialog(); - mMessageDialog = new GUIMessageDialog(this->getTopWidget()); + mMessageDialog = new GUIMessageDialog(QApplication::activeWindow()); if (msg) { QString* str = (QString*)msg; diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index 192692e..d045be9 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -27,7 +27,8 @@ public: ~DialogManager() override; void init(); - QWidget* getTopWidget(); + void setTopWidget(QWidget* widget); + void releaseTopWidget(QWidget* expectedTopWidget); void requestLogin(); int requestAddAccount(QSqlTableModel* model); int requestEditSelfAccount(); @@ -43,7 +44,9 @@ private: QDialog* mFunctionDialog; GUIMessageDialog* mMessageDialog; - QStack topWidgetStore; + QWidget* topWidget; + std::mutex mutex; + int mDialogCount = 0; }; #endif //GUI_DIALOGMANAGER_H diff --git a/src/forms/select/SelectFormWidget.cpp b/src/forms/select/SelectFormWidget.cpp index bbd4099..8801192 100644 --- a/src/forms/select/SelectFormWidget.cpp +++ b/src/forms/select/SelectFormWidget.cpp @@ -15,7 +15,7 @@ #include "components/SlideTableView.h" #include "db/SQLHelper.h" #include "event/EventCenter.h" -#include "dialogs/AccountFormDialog.h" +#include "dialogs/DialogManager.h" #include "dialogs/AlertDialog.h" #include "log/UserOperationLog.h" #include "components/VerticalTextToolButton.h" @@ -83,11 +83,7 @@ void SelectFormWidget::initGeneralButtons(QHBoxLayout *layout) { layout->addWidget(mBtnAccount); layout->addWidget(mBtnWorklist); // mBtn account slot - connect(mBtnAccount, &QToolButton::clicked, [=]() { - AccountFormDialog dialog(this); - dialog.setWindowModality(Qt::WindowModal); - dialog.exec(); - }); + connect(mBtnAccount, &QToolButton::clicked, DialogManager::Default(),&DialogManager::requestEditSelfAccount); } void SelectFormWidget::initPatEditButtons(QHBoxLayout *layout) {