Refactor DialogManager.3

This commit is contained in:
Krad
2022-07-21 10:39:24 +08:00
parent 0291c7d995
commit b86b19e91d
3 changed files with 57 additions and 31 deletions

View File

@@ -7,6 +7,7 @@
#include <QApplication> #include <QApplication>
#include <QWidget> #include <QWidget>
#include <QThread> #include <QThread>
#include <qDebug>
#include "event/EventCenter.h" #include "event/EventCenter.h"
#include "dialogs/GUIMessageDialog.h" #include "dialogs/GUIMessageDialog.h"
@@ -21,6 +22,7 @@ DialogManager::DialogManager()
: QObject() : QObject()
, mFunctionDialog(nullptr) , mFunctionDialog(nullptr)
, mMessageDialog(nullptr) , mMessageDialog(nullptr)
, topWidget(nullptr)
{ {
} }
@@ -33,9 +35,32 @@ void DialogManager::init() {
connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd); connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd);
} }
QWidget *DialogManager::getTopWidget() { //得考虑多线程的问题
if (!topWidgetStore.isEmpty()) return topWidgetStore.top(); void DialogManager::setTopWidget(QWidget* widget) {
return QApplication::activeWindow(); std::lock_guard<std::mutex> lockGuard(mutex);
if (!topWidget&& QApplication::activeWindow()){
topWidget = QApplication::activeWindow();
}
qDebug()<<"last top:"<<topWidget->objectName()<<", new top:"<<widget->objectName();
widget->setParent(topWidget,widget->windowFlags());
topWidget = widget;
++mDialogCount;
}
void DialogManager::releaseTopWidget(QWidget* expectedTopWidget) {
std::lock_guard<std::mutex> 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() void DialogManager::requestLogin()
@@ -44,57 +69,59 @@ void DialogManager::requestLogin()
if (!mFunctionDialog){ if (!mFunctionDialog){
mFunctionDialog = new LoginDialog; mFunctionDialog = new LoginDialog;
} }
mFunctionDialog->setWindowModality(Qt::WindowModal);
mFunctionDialog->exec(); mFunctionDialog->exec();
while (QDialog::Accepted != mFunctionDialog->result()) while (QDialog::Accepted != mFunctionDialog->result())
{ {
mFunctionDialog->exec(); mFunctionDialog->exec();
} }
} }
int DialogManager::requestAddAccount(QSqlTableModel* model) { int DialogManager::requestAddAccount(QSqlTableModel* model) {
AccountFormDialog dialog(getTopWidget(), New); AccountFormDialog dialog(nullptr, New);
topWidgetStore.push(&dialog); setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal); dialog.setWindowModality(Qt::WindowModal);
dialog.setReferenceModel(model); dialog.setReferenceModel(model);
int ret = dialog.exec(); int ret = dialog.exec();
topWidgetStore.pop(); releaseTopWidget(&dialog);
return ret; return ret;
} }
int DialogManager::requestEditSelfAccount() { int DialogManager::requestEditSelfAccount() {
AccountFormDialog dialog(getTopWidget(), Self); AccountFormDialog dialog(nullptr, Self);
topWidgetStore.push(&dialog); setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal); dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec(); int ret = dialog.exec();
topWidgetStore.pop(); releaseTopWidget(&dialog);
return ret; return ret;
} }
int DialogManager::requestEditAdminAccount(const QMap<QString, QVariant>& values) { int DialogManager::requestEditAdminAccount(const QMap<QString, QVariant>& values) {
AccountFormDialog dialog(getTopWidget(), Admin); AccountFormDialog dialog(nullptr, Admin);
topWidgetStore.push(&dialog); setTopWidget(&dialog);
dialog.setAccountInformation(values); dialog.setAccountInformation(values);
dialog.setWindowModality(Qt::WindowModal); dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec(); int ret = dialog.exec();
topWidgetStore.pop(); releaseTopWidget(&dialog);
return ret; return ret;
} }
void DialogManager::requestChangePassword() { void DialogManager::requestChangePassword() {
ChangePasswordFormDialog dialog(getTopWidget()); ChangePasswordFormDialog dialog;
topWidgetStore.push(&dialog); setTopWidget(&dialog);
dialog.setGeometry(getTopWidget()->geometry()); dialog.setGeometry(dialog.parentWidget()->geometry());
dialog.setWindowModality(Qt::WindowModal); dialog.setWindowModality(Qt::WindowModal);
dialog.exec(); dialog.exec();
topWidgetStore.pop(); releaseTopWidget(&dialog);
} }
//考虑以后使用另外的dialog显示错误 //考虑以后使用另外的dialog显示错误
void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
if (!this->getTopWidget()->isVisible()) return;
clearMessageDialog(); clearMessageDialog();
//new dialog //new dialog
auto dialog = new GUIMessageDialog(this->getTopWidget()); auto dialog = new GUIMessageDialog;
if (msg) { if (msg) {
QString *str = (QString *) msg; QString *str = (QString *) msg;
dialog->showMessage(*str); dialog->showMessage(*str);
@@ -103,11 +130,11 @@ void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
} }
dialog->stopLoading(); dialog->stopLoading();
dialog->showExitButton(); dialog->showExitButton();
topWidgetStore.push(dialog); setTopWidget(dialog);
dialog->setWindowModality(Qt::NonModal); dialog->setWindowModality(Qt::NonModal);
dialog->exec(); dialog->exec();
auto lastDialog = topWidgetStore.pop(); releaseTopWidget(dialog);
lastDialog->deleteLater(); dialog->deleteLater();
} }
// 扫描过程 dialog 只能为最底层并且会被error dialog 清除! // 扫描过程 dialog 只能为最底层并且会被error dialog 清除!
@@ -115,9 +142,9 @@ void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) {
//没有目标parent 撤销操作 //没有目标parent 撤销操作
if (!QApplication::activeWindow()) return; if (!QApplication::activeWindow()) return;
//只能在最底层窗口上模态 //只能在最底层窗口上模态
if (!topWidgetStore.isEmpty()) return; if (mDialogCount>0) return;
clearMessageDialog(); clearMessageDialog();
mMessageDialog = new GUIMessageDialog(this->getTopWidget()); mMessageDialog = new GUIMessageDialog(QApplication::activeWindow());
if (msg) if (msg)
{ {
QString* str = (QString*)msg; QString* str = (QString*)msg;

View File

@@ -27,7 +27,8 @@ public:
~DialogManager() override; ~DialogManager() override;
void init(); void init();
QWidget* getTopWidget(); void setTopWidget(QWidget* widget);
void releaseTopWidget(QWidget* expectedTopWidget);
void requestLogin(); void requestLogin();
int requestAddAccount(QSqlTableModel* model); int requestAddAccount(QSqlTableModel* model);
int requestEditSelfAccount(); int requestEditSelfAccount();
@@ -43,7 +44,9 @@ private:
QDialog* mFunctionDialog; QDialog* mFunctionDialog;
GUIMessageDialog* mMessageDialog; GUIMessageDialog* mMessageDialog;
QStack<QDialog*> topWidgetStore; QWidget* topWidget;
std::mutex mutex;
int mDialogCount = 0;
}; };
#endif //GUI_DIALOGMANAGER_H #endif //GUI_DIALOGMANAGER_H

View File

@@ -15,7 +15,7 @@
#include "components/SlideTableView.h" #include "components/SlideTableView.h"
#include "db/SQLHelper.h" #include "db/SQLHelper.h"
#include "event/EventCenter.h" #include "event/EventCenter.h"
#include "dialogs/AccountFormDialog.h" #include "dialogs/DialogManager.h"
#include "dialogs/AlertDialog.h" #include "dialogs/AlertDialog.h"
#include "log/UserOperationLog.h" #include "log/UserOperationLog.h"
#include "components/VerticalTextToolButton.h" #include "components/VerticalTextToolButton.h"
@@ -83,11 +83,7 @@ void SelectFormWidget::initGeneralButtons(QHBoxLayout *layout) {
layout->addWidget(mBtnAccount); layout->addWidget(mBtnAccount);
layout->addWidget(mBtnWorklist); layout->addWidget(mBtnWorklist);
// mBtn account slot // mBtn account slot
connect(mBtnAccount, &QToolButton::clicked, [=]() { connect(mBtnAccount, &QToolButton::clicked, DialogManager::Default(),&DialogManager::requestEditSelfAccount);
AccountFormDialog dialog(this);
dialog.setWindowModality(Qt::WindowModal);
dialog.exec();
});
} }
void SelectFormWidget::initPatEditButtons(QHBoxLayout *layout) { void SelectFormWidget::initPatEditButtons(QHBoxLayout *layout) {