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(); // 关闭对话框,返回取消状态

}

相关推荐
2401_8920709816 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei16 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
不爱吃炸鸡柳17 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发17 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎17 小时前
STL 栈 队列
开发语言·c++
2401_8920709818 小时前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
cccyi718 小时前
【C++ 脚手架】etcd 的介绍与使用
c++·服务发现·etcd·服务注册
liu****18 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯