浏览代码

update: release page when changed

YaoH 3 周之前
父节点
当前提交
5bc2cb2631
共有 3 个文件被更改,包括 90 次插入26 次删除
  1. 87 24
      blastopepage.cpp
  2. 2 2
      blastopepage.h
  3. 1 0
      mainwindow.cpp

+ 87 - 24
blastopepage.cpp

@@ -1,5 +1,7 @@
 #include "blastopepage.h"
 #include "blastopepage.h"
 
 
+#include <QtCore/qlogging.h>
+
 #include <QFont>
 #include <QFont>
 #include <QProcessEnvironment>
 #include <QProcessEnvironment>
 #include <QWebEngineSettings>
 #include <QWebEngineSettings>
@@ -51,16 +53,24 @@ void BlastOpePage::InitFace() {
     Logger::getInstance().info("start init face verification");
     Logger::getInstance().info("start init face verification");
     LoadingWidget::showLoading(this, "请求创建人脸识别...");
     LoadingWidget::showLoading(this, "请求创建人脸识别...");
 
 
-    layout = new QVBoxLayout(this);
-    // TODO: relase the qwebengineview when not successfully verified
-    view = new QWebEngineView(this);
-    view->setAttribute(Qt::WA_OpaquePaintEvent);
+    m_faceVerifyLayout = new QVBoxLayout(this);
+    // Create new WebEngineView
+    m_faceverifyWebView = new QWebEngineView(this);
+    m_faceverifyWebView->setAttribute(Qt::WA_OpaquePaintEvent);
+
+    // Configure web settings for better performance
+    QWebEngineSettings *settings = m_faceverifyWebView->settings();
+    settings->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
+    settings->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);
+    settings->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
 
 
-    QWebEnginePage *page = view->page();
+    QWebEnginePage *page = m_faceverifyWebView->page();
 
 
     QJsonObject metaInfo = getMetaInfo();
     QJsonObject metaInfo = getMetaInfo();
     if (metaInfo["certName"] == "" || metaInfo["certNo"] == "") {
     if (metaInfo["certName"] == "" || metaInfo["certNo"] == "") {
         QMessageBox::information(nullptr, "获取用户信息错误", "未获得用户的身份证信息,请联系管理员");
         QMessageBox::information(nullptr, "获取用户信息错误", "未获得用户的身份证信息,请联系管理员");
+        LoadingWidget::hideLoading();
+        closeWebViewAndRestoreUI();  // Clean up on error
         return;
         return;
     }
     }
 
 
@@ -78,6 +88,8 @@ void BlastOpePage::InitFace() {
             QString("创建人脸识别请求服务器返回错误: userName: %1. response: %2")
             QString("创建人脸识别请求服务器返回错误: userName: %1. response: %2")
                 .arg(metaInfo["certName"].toString(), QString::fromUtf8(QJsonDocument(response).toJson())));
                 .arg(metaInfo["certName"].toString(), QString::fromUtf8(QJsonDocument(response).toJson())));
         QMessageBox::critical(nullptr, "错误", "无法创建人脸识别,请确认后台录入的身份信息正确");
         QMessageBox::critical(nullptr, "错误", "无法创建人脸识别,请确认后台录入的身份信息正确");
+        LoadingWidget::hideLoading();
+        closeWebViewAndRestoreUI();  // Clean up on error
         return;
         return;
     }
     }
     if (response.contains("data") && response["data"].isObject()) {
     if (response.contains("data") && response["data"].isObject()) {
@@ -94,29 +106,77 @@ void BlastOpePage::InitFace() {
         }
         }
     }
     }
     if (!certifyUrl.isEmpty()) {
     if (!certifyUrl.isEmpty()) {
-        view->load(QUrl(certifyUrl));
-
-        layout->addWidget(view);
+        LoadingWidget::showLoading(this, "加载人脸识别页面...");
+
+        // Handle page load events
+        QObject::connect(m_faceverifyWebView, &QWebEngineView::loadStarted, this,
+                         [this]() { qDebug() << "Face verification page loading started"; });
+
+        QObject::connect(m_faceverifyWebView, &QWebEngineView::loadFinished, this, [this](bool success) {
+            if (!success) {
+                Logger::getInstance().error("Face verification page failed to load");
+                QMessageBox::warning(nullptr, "加载失败", "人脸识别页面加载失败,请重试");
+                LoadingWidget::hideLoading();
+                closeWebViewAndRestoreUI();
+                return;
+            }
+            qDebug() << "Face verification page loaded successfully";
+            LoadingWidget::hideLoading();
+        });
 
 
-        layout->setStretchFactor(view, 1);
+        // Load URL and add to layout
+        m_faceverifyWebView->load(QUrl(certifyUrl));
+        m_faceVerifyLayout->addWidget(m_faceverifyWebView);
+        m_faceVerifyLayout->setStretchFactor(m_faceverifyWebView, 1);
 
 
+        // Connect URL change signal
         QObject::connect(page, &QWebEnginePage::urlChanged, this, &BlastOpePage::onUrlChanged);
         QObject::connect(page, &QWebEnginePage::urlChanged, this, &BlastOpePage::onUrlChanged);
     } else {
     } else {
         QMessageBox::information(nullptr, "提示", "人脸识别请求失败");
         QMessageBox::information(nullptr, "提示", "人脸识别请求失败");
         Logger::getInstance().error("FaceVerificationInit: Failed to get certifyUrl");
         Logger::getInstance().error("FaceVerificationInit: Failed to get certifyUrl");
         LoadingWidget::hideLoading();
         LoadingWidget::hideLoading();
+        closeWebViewAndRestoreUI();  // Clean up on error
     }
     }
 }
 }
 
 
 void BlastOpePage::closeWebViewAndRestoreUI() {
 void BlastOpePage::closeWebViewAndRestoreUI() {
-    if (view) {
-        layout->removeWidget(view);
-        delete view;
-        view = nullptr;
+    // Safely disconnect signals first
+    if (m_faceverifyWebView) {
+        // Disconnect specific signals instead of wildcard disconnect
+        if (m_faceverifyWebView->page()) {
+            QWebEnginePage *page = m_faceverifyWebView->page();
+            // Disconnect specific signals to avoid wildcard issues
+            QObject::disconnect(page, &QWebEnginePage::featurePermissionRequested, this, nullptr);
+            QObject::disconnect(page, &QWebEnginePage::urlChanged, this, nullptr);
+        }
+
+        // Stop any ongoing operations
+        m_faceverifyWebView->stop();
+
+        // Remove from layout before deleting
+        if (m_faceVerifyLayout) {
+            m_faceVerifyLayout->removeWidget(m_faceverifyWebView);
+        }
+
+        // Clean up the web view
+        m_faceverifyWebView->setParent(nullptr);
+        m_faceverifyWebView->deleteLater();
+        m_faceverifyWebView = nullptr;
     }
     }
-    if (layout) {
-        delete layout;
-        layout = nullptr;
+
+    if (m_faceVerifyLayout) {
+        // Clear all layout items properly
+        QLayoutItem *item;
+        while ((item = m_faceVerifyLayout->takeAt(0)) != nullptr) {
+            if (QWidget *widget = item->widget()) {
+                widget->setParent(nullptr);
+            }
+            delete item;
+        }
+
+        // Delete layout
+        delete m_faceVerifyLayout;
+        m_faceVerifyLayout = nullptr;
     }
     }
 }
 }
 
 
@@ -124,7 +184,6 @@ void BlastOpePage::closeWebViewAndRestoreUI() {
 void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
 void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
     LoadingWidget::showLoading(this, "查询验证结果...");
     LoadingWidget::showLoading(this, "查询验证结果...");
     if (newUrl.host() == "www.integrateblaster.com") {
     if (newUrl.host() == "www.integrateblaster.com") {
-        closeWebViewAndRestoreUI();
         QNetworkAccessManager manager;
         QNetworkAccessManager manager;
         QUrl requestUrl(apiBackendUrl.resolved(QUrl(QString("h-face-verify/certifyId/%1").arg(certifyId))));
         QUrl requestUrl(apiBackendUrl.resolved(QUrl(QString("h-face-verify/certifyId/%1").arg(certifyId))));
         QNetworkRequest request(requestUrl);
         QNetworkRequest request(requestUrl);
@@ -145,19 +204,25 @@ void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
                     Logger::getInstance().error(QString("获取认证初始化数据失败. message: %1.").arg(message));
                     Logger::getInstance().error(QString("获取认证初始化数据失败. message: %1.").arg(message));
                     int ret = QMessageBox::information(nullptr, "认证失败", message + " ,请重新认证!");
                     int ret = QMessageBox::information(nullptr, "认证失败", message + " ,请重新认证!");
                     if (ret == QMessageBox::Ok) {
                     if (ret == QMessageBox::Ok) {
+                        LoadingWidget::hideLoading();
                         InitFace();
                         InitFace();
+                        return;
                     }
                     }
                 } else {
                 } else {
                     QString passed = resultObj["Passed"].toString();
                     QString passed = resultObj["Passed"].toString();
                     if (passed == "T") {
                     if (passed == "T") {
+                        closeWebViewAndRestoreUI();  // Clean up web view first
                         ui->setupUi(this);
                         ui->setupUi(this);
                         initPagination();
                         initPagination();
                         Logger::getInstance().info(QString("进入认证界面"));
                         Logger::getInstance().info(QString("进入认证界面"));
                         LoadingWidget::hideLoading();
                         LoadingWidget::hideLoading();
+                        return;  // Early return to avoid duplicate cleanup
                     } else if (passed == "F") {
                     } else if (passed == "F") {
                         int ret = QMessageBox::critical(nullptr, "提示", "操作失败,请重新认证!");
                         int ret = QMessageBox::critical(nullptr, "提示", "操作失败,请重新认证!");
                         if (ret == QMessageBox::Ok) {
                         if (ret == QMessageBox::Ok) {
+                            LoadingWidget::hideLoading();
                             InitFace();
                             InitFace();
+                            return;
                         }
                         }
                     }
                     }
                 }
                 }
@@ -171,18 +236,16 @@ void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
         reply->deleteLater();
         reply->deleteLater();
         LoadingWidget::hideLoading();
         LoadingWidget::hideLoading();
     }
     }
+    closeWebViewAndRestoreUI();
     LoadingWidget::hideLoading();
     LoadingWidget::hideLoading();
 }
 }
 
 
 BlastOpePage::~BlastOpePage() {
 BlastOpePage::~BlastOpePage() {
-    delete ui;
+    // Clean up web resources first
+    closeWebViewAndRestoreUI();
 
 
-    if (view) {
-        delete view;
-    }
-    if (layout) {
-        delete layout;
-    }
+    // Clean up other resources
+    delete ui;
 }
 }
 
 
 QJsonObject BlastOpePage::sendPostRequest(const QUrl &url, const QJsonObject &data) {
 QJsonObject BlastOpePage::sendPostRequest(const QUrl &url, const QJsonObject &data) {

+ 2 - 2
blastopepage.h

@@ -76,8 +76,8 @@ class BlastOpePage : public QWidget {
     QList<HeaderInfo> headers;
     QList<HeaderInfo> headers;
     QStandardItemModel *model;
     QStandardItemModel *model;
     QMap<QString, firingWidget *> firingWidgetByUuid;
     QMap<QString, firingWidget *> firingWidgetByUuid;
-    QWebEngineView *view;
-    QVBoxLayout *layout;
+    QWebEngineView *m_faceverifyWebView;
+    QVBoxLayout *m_faceVerifyLayout;
     QString certifyId;
     QString certifyId;
     PageWidget *pageWidget;
     PageWidget *pageWidget;
     QJsonArray dataArray;
     QJsonArray dataArray;

+ 1 - 0
mainwindow.cpp

@@ -120,6 +120,7 @@ void MainWindow::switchPage(QWidget *button) {
             existingPage->hide();
             existingPage->hide();
             ui->stackedWidget->removeWidget(existingPage);
             ui->stackedWidget->removeWidget(existingPage);
             createdPageByButton.remove(button);
             createdPageByButton.remove(button);
+            delete existingPage;  // 删除旧页面
         }
         }
 
 
         QWidget *newPage = factory->createPage(this);
         QWidget *newPage = factory->createPage(this);