当前位置: 首页 > news >正文

qwebengineview 锲入网页并关闭

#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_OBJECT
public:
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_OBJECT
public:
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)
{
// 将对象注册到 WebChannel
m_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(); // 关闭对话框,返回取消状态
}

http://www.jsqmd.com/news/500561/

相关文章:

  • 新一代算力卡皇英伟达Pro6000
  • 青海口碑好的成品油检测服务商厂家,排名前十有哪些 - 工业品网
  • 为什么在 MySQL 中不推荐使用多表 JOIN?
  • 收藏必备:小白程序员轻松入门大模型,从0到1掌握AI学习秘籍!
  • # 金丝雀发布实战:用 Go 实现渐进式流量灰度部署在微服务架构日益普及的今天,**如何安全、可控地发布新版
  • 2026年GEO营销变革前瞻:五大源头技术企业深度解析与选购指南 - 2026年企业推荐榜
  • sdut-python-实验二-程序流程控制(1-10)
  • 大模型/智能体/rag幻觉问题的根因和解决方案
  • SQL文件与ER截图
  • 考研复试准备:用AI项目展示你的编程能力
  • github标星no.1!堪称3月前端面试最强指南!!!
  • 2026年充电桩加盟品牌推荐:县域下沉市场低门槛入局口碑好品牌与避坑指南 - 十大品牌推荐
  • 2026宠物绝育指南:如何找到技术好的医生?宠物绝育医生深度解析 - 品牌推荐师
  • 深度解析:KMP跨平台开发转型中的安卓工程师能力模型与实战指南
  • 腾讯云高主频服务器|游戏 / 电商
  • 充电桩品牌如何选不迷茫?2026年全球市场适配与技术服务靠谱推荐 - 十大品牌推荐
  • 出海巴西,合规雇佣:Safeguard Global——您的全球人力资源合伙人 - 品牌2026
  • 在 Windows 平台安装 Claude Code
  • 一套用 Python 搞定“自动调参 + 训练监控”的实战方案
  • draw.io免费免安装版百度网盘
  • 深入解析:如何突破CANFD总线多节点扩展的瓶颈与实战方案
  • 出海澳洲,合规雇佣:Safeguard Global——您的全球人力资源合伙人 - 品牌2026
  • 2026年充电桩加盟品牌推荐:区域投资者掘金新能源市场靠谱选择与避坑盘点 - 十大品牌推荐
  • 维赛免清洗防锈油|焊接前不用洗,防锈还能直接焊
  • 鲸地图全面进化,服务功能有哪些升级?
  • 别只盯着银含量——银包镍粉的性能密码藏在核芯形貌里
  • 机器人算法工程师必知必会:主流计算平台选型指南
  • 十大CRM销售管理软件全维度对比:功能、适配场景、性价比一次看透 - 毛毛鱼的夏天
  • 小米 MiMo-V2 系列完全指南 2026:Pro/Omni/TTS 三大模型全面解读
  • 2026年充电桩加盟品牌推荐:区域投资者掘金新能源市场靠谱选择与避坑指南 - 十大品牌推荐