
#ifndef WEBLOGINDIALOG_H#define WEBLOGINDIALOG_H#include QDialog#include QObject#include QJsonValue#include QWebEngineView#include QVBoxLayout#include QWebChannel// 自定义用户身份信息struct UserIdentityInfo{QString userId;QString userName;QString token;};Q_DECLARE_METATYPE(UserIdentityInfo);// JS 可调用的桥接对class WebLoginBridge : public QObject{Q_OBJECTpublic:explicit WebLoginBridge(QObject *parent nullptr);// 供 JS 调用的登录方法Q_INVOKABLE 标记Q_INVOKABLE bool Login(const QJsonValue LoginInfo);// 供 JS 调用的退出方法Q_INVOKABLE bool Exit();signals:// 登录成功信号和你项目 LoginSignal 对应void LoginSignal(const UserIdentityInfo Info);// 退出信号和你项目 ExitSignal 对应void ExitSignal();};// 登录窗class WebLoginDialog : public QDialog{Q_OBJECTpublic:explicit WebLoginDialog(const QString LoginUrl, QWidget *parent nullptr);~WebLoginDialog();public slots:// 处理登录成功的槽函数和你项目 onLoginSlot 对应void OnLoginSlot(const UserIdentityInfo Info);// 处理退出的槽函数和你项目 onExitSlot 对应void OnExitSlot();private:// 封装的 RegisterObject 方法和你项目 WebWidget::RegisterObject 对应void RegisterObject(const QString name, QObject *obj);WebLoginBridge *m_loginHandler; // 登录业务对象和你项目 LoginHandler 对应QWebEngineView *m_webWidget; // 网页视图和你项目 p-WebWidget 对应QWebChannel *m_webChannel; // WebChannel 通道底层通信依赖};#endif // WEBLOGINDIALOG_H#include WebLoginDialog.h#include QJsonObject#include QMessageBox#include QWebEnginePage// ------------------------------ WebLoginBridge 实现 ------------------------------WebLoginBridge::WebLoginBridge(QObject *parent): QObject(parent){}bool WebLoginBridge::Login(const QJsonValue LoginInfo){// 解析 JS 传入的 JSON 登录数据if (!LoginInfo.isObject()) return false;QJsonObject jsonObj LoginInfo.toObject();UserIdentityInfo info;info.userId jsonObj[userId].toString();info.userName jsonObj[userName].toString();info.token jsonObj[token].toString();// ✅ 关键登录成功后发送信号和你项目 emit LoginSignal 完全一致emit LoginSignal(info);return true;}bool WebLoginBridge::Exit(){// ✅ 发送退出信号和你项目 emit ExitSignal 完全一致emit ExitSignal();return true;}// ------------------------------ WebLoginDialog 实现 ------------------------------WebLoginDialog::WebLoginDialog(const QString LoginUrl, QWidget *parent): QDialog(parent){// 窗口样式和你项目一致无边框、全屏setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);setFixedSize(800, 600);// 1. 初始化 WebChannel底层通信通道m_webChannel new QWebChannel(this);// 2. 初始化登录业务对象和你项目 LoginHandler 一致m_loginHandler new WebLoginBridge(this);// 3. 初始化网页视图和你项目 p-WebWidget 一致m_webWidget new QWebEngineView(this);m_webWidget-setUrl(QUrl(LoginUrl));// ✅ 关键和你项目一致的 RegisterObject 逻辑// 将 C 对象注册到 WebChannel供 JS 调用RegisterObject(LoginObj, m_loginHandler);// 4. 布局设置和你项目 Layout 一致QVBoxLayout *layout new QVBoxLayout(this);layout-setContentsMargins(0, 0, 0, 0);layout-addWidget(m_webWidget);setLayout(layout);// 5. 信号槽连接和你项目 connect 完全一致connect(m_loginHandler, WebLoginBridge::LoginSignal,this, WebLoginDialog::OnLoginSlot);connect(m_loginHandler, WebLoginBridge::ExitSignal,this, WebLoginDialog::OnExitSlot);}WebLoginDialog::~WebLoginDialog(){// Qt 父子机制自动释放内存}// 封装的 RegisterObject 方法和你项目 WebWidget::RegisterObject 对应void WebLoginDialog::RegisterObject(const QString name, QObject *obj){// 将对象注册到 WebChannelm_webChannel-registerObject(name, obj);// 将 WebChannel 绑定到网页必须执行JS 才能通信m_webWidget-page()-setWebChannel(m_webChannel);}// 登录成功槽函数和你项目 onLoginSlot 一致void WebLoginDialog::OnLoginSlot(const UserIdentityInfo Info){// 登录成功后提示并关闭窗口QMessageBox::information(this, 登录成功,QString(欢迎 %1\nToken%2).arg(Info.userName).arg(Info.token));this-accept(); // 关闭对话框返回成功状态}// 退出槽函数和你项目 onExitSlot 一致void WebLoginDialog::OnExitSlot(){this-reject(); // 关闭对话框返回取消状态}