C++ Qt 学习(五):Qt Web 编程
1. Chrome 技术介绍
- 大多数 web 技术都是基于 chrome,例如 CEF、QCefView 以及 QWebEngineView,这些都是在 native 界面里用来显示 html 网页,并且可以与 web 交互
- 例如常见的登录窗口、优酷的视频区域、WPS 的稻壳商城等,这些都是用 web 技术实现的
- 而 native 端,只需要把把网页展示出来,实现交互即可
2. VS2019 编译与使用 CEF
2.1 CEF 下载与编译
-
CEF 下载链接

-
下载上图箭头所指链接,解压后按下图重命名文件夹,并新建 build 和 sdk 两个文件夹

-
用 CMake 工具编译上述 CEF 包,按下图配置
- 基于Windows的Cmake安装教程

- 基于Windows的Cmake安装教程
-
编译成后点击上图中的 Open Project 进入 VS2019 中
- F7 生成解决方案后报错如下,修改箭头处代码如图所示,保存后再次 F7 生成解决方案

- F7 生成解决方案后报错如下,修改箭头处代码如图所示,保存后再次 F7 生成解决方案
2.2 CEF 案例运行
- 将 cefsimple 设置为启动项目,启动本地调试器,出现百度搜索界面
- 注意修改下图代码中 url 链接为百度

- 注意修改下图代码中 url 链接为百度

3. QWebEngineView 基本用法
-
Widget 提升为 QWebEngineView

-
.pro 中添加头文件
QT += core gui webenginewidgets -
widget.cpp
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->web_widget->setUrl(QUrl("http://www.baidu.com"));ui->web_widget->show(); }Widget::~Widget() {delete ui; }

4. Qt html js 交互
- qt 除了可以显示网页,还可以和网页交互,互相发消息,调用函数

- QtWebDemo.h
#pragma once#include <QtWidgets/QWidget>
#include "ui_QtWebDemo.h"
#include "WebObject.h"class QtWebDemo : public QWidget {Q_OBJECTpublic:QtWebDemo(QWidget *parent = Q_NULLPTR);~QtWebDemo();public slots:void on_btnSend_clicked();void update_text(const QString& htmltext);private:Ui::QtWebDemoClass ui;WebObject* m_pWebObj = nullptr;
};
- QtWebDemo.cpp
#include "QtWebDemo.h"
#include <QWebChannel>
#include <QWebEnginePage>QtWebDemo::QtWebDemo(QWidget *parent) : QWidget(parent) {ui.setupUi(this);QString path = QApplication::applicationDirPath() + "/WebPage/index.html";ui.webEngineView->setUrl(QUrl(path));m_pWebObj = new WebObject();QWebEnginePage* pPage = ui.webEngineView->page();// Qt 和 html js 的桥梁:QWebChannelQWebChannel* channel = new QWebChannel(this);// 注册 html 对象// 第二个参数需要是 QObject 的派生类channel->registerObject(QStringLiteral("content"), m_pWebObj); pPage->setWebChannel(channel);connect(m_pWebObj, &WebObject::sig_SendToUI, this, &QtWebDemo::update_text);
}void QtWebDemo::on_btnSend_clicked() {QString text = ui.lineEdit->text();m_pWebObj->SendTextToHtml(text);
}QtWebDemo::~QtWebDemo() {delete m_pWebObj;
}void QtWebDemo::update_text(const QString& htmltext) {ui.plainTextEdit->appendPlainText(htmltext);
}
- WebObject.h
#pragma once#include <QObject>class WebObject : public QObject {Q_OBJECTpublic:WebObject(QObject* parent = nullptr) :QObject(parent) {}~WebObject();void SendTextToHtml(const QString& text);// 接收来自 html 发来的内容,必须要加 Q_INVOKABLE,不然收不到Q_INVOKABLE void receiveTextFromHtml(const QString& r_text);signals:void sig_sendTextToHtml(const QString& text);void sig_SendToUI(const QString& htmltext);
};
- WebObject.cpp
#include "WebObject.h"WebObject::~WebObject() {}void WebObject::SendTextToHtml(const QString& text) {emit sig_sendTextToHtml(text);
}void WebObject::receiveTextFromHtml(const QString& htmltext) {emit sig_SendToUI(htmltext);
}
5. Qt ECharts 使用详解
- ECharts:比 QCustomPlot、QWT、QCharts 更好的开源图表曲线组件

- widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QString exe_path = qApp->applicationDirPath();QString _klinePath = exe_path + "/myecharts/candlestick-simple.html";ui->web_widget->setUrl(QUrl(_klinePath));connect(ui->radioButton_kline, &QRadioButton::toggled, [=](bool checked){if(checked) {ui->web_widget->setUrl(QUrl(_klinePath));}});connect(ui->radioButton_line, &QRadioButton::toggled, [=](bool checked){if(checked) {QString _linePath = exe_path + "/myecharts/line-smooth.html";ui->web_widget->setUrl(QUrl(_linePath));}});
}Widget::~Widget() {delete ui;
}
相关文章:
C++ Qt 学习(五):Qt Web 编程
1. Chrome 技术介绍 大多数 web 技术都是基于 chrome,例如 CEF、QCefView 以及 QWebEngineView,这些都是在 native 界面里用来显示 html 网页,并且可以与 web 交互 例如常见的登录窗口、优酷的视频区域、WPS 的稻壳商城等,这些都…...
基于arm-gcc 工具链开发mcu程序时,怎么便捷查看内存映像
目录 一、背景 arm-none-eabi-size 二、脚本实现 2.1. 源码2.2. 效果呈现 三、实现说明 3.1 基本思路3.2 涉及到的shell 相关知识 3.2.1 sed 实现只打印第二行3.2.2 cut 截取某一行数据的第n个字段3.2.3 使用bc 计算器,实现浮点运算 一、背景 arm-gcc 工具链…...
亚马逊云科技Zero ETL集成全面可用,可运行近乎实时的分析和机器学习
亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian曾指出:“数据是应用、流程和商业决策的核心。”如今,客户常用的数据传输模式是建立从Amazon Aurora到Amazon Redshift的数据管道。这些解决方案能够帮助客户获得新的见解&#x…...
Java 设计模式——访问者模式
目录 1.概述2.结构3.案例实现3.1.抽象访问者类3.2.抽象元素类3.3.具体元素类3.4.具体访问者类3.5.对象结构类3.6.测试 4.优缺点5.使用场景6.扩展6.1.分派6.2.动态分配6.3.静态分配6.4.双分派 1.概述 访问者模式 (Visitor Pattern) 是一种行为型设计模式,它用于将数…...
Mysql联合查询
Mysql联合查询 T1表结构(用户名,密码) useridusernamepassword1jackpwd12owenpwd2 T2表结构(用户名,密码) useridjifendengji12033506 第一:内联(inner join) 如果想把用户信息、积分、等…...
响应式婴幼儿早教启蒙网站模板源码
模板信息: 模板编号:6830 模板编码:UTF8 模板颜色:红色 模板分类:学校、教育、培训、科研 适合行业:培训机构类企业 模板介绍: 本模板自带eyoucms内核,无需再下载eyou系统…...
ChatGPT付费创作系统V2.4.9独立版 +WEB端+ H5端 + 小程序端系统测试安装教程
播资源提供的GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT!…...
react 修改less文件后保存,内存溢出,项目崩溃问题解决
一、完整报错 一个很老的react项目,因为没有package-lock.json版本锁,导致拉下来的时候,安装的依赖版本冲突,好不容易启动起来,修改less文件后只要一保存,项目就会崩溃,需要重启,报…...
Lib文件和netlist的关系,DDC文件和netlist的区别
今天来说一说两个基础的概念: 1:综合用的Lib文件和netlist网表的关系 在数字IC设计中,Lib和网表都是非常重要的文件,但它们的作用和用途有很大的区别。 Lib文件,也称为库文件,主要包含单元级的信息&…...
万宾科技智能井盖,实现对井盖的监测
随着人工智能和物联网技术的不断变化,各种适用于市政府提高管理能力和公共服务水平的高科技产品不断更新。在道路基础设施建设过程中,智能井盖传感器的出现时刻保护着城市地下生命线,而且可以对地下水道井盖进行实时的监测并完成数据上传等工…...
使用Python从零实现多分类SVM
前言 本文将首先简要概述支持向量机及其训练和推理方程,然后将其转换为代码以开发支持向量机模型。之后然后将其扩展成多分类的场景,并通过使用Sci-kit Learn测试我们的模型来结束。 SVM概述 支持向量机的目标是拟合获得最大边缘的超平面(两个类中最近…...
WPF ToggleButton 主题切换动画按钮
WPF ToggleButton 主题切换动画按钮 仿造最近看到的html中的一个效果,大致思路是文章这样,感觉还可以再雕琢一下。 代码如下 XAML: <UserControl x:Class"WPFSwitch.AnimationSwitch"xmlns"http://schemas.microsoft.com/winfx/200…...
centerOS下docker 搭建IotDB集群
一、准备3台机器,IP地址依次为IP1,IP2,IP3,找一个目录下建立文件夹如下: ./data/confignode ./logs/confignode ./data/datanode ./logs/datanode二、在当前目录下建立docker-compose.yml文件,3台都要 1、…...
Vue3-Composition-API-学习笔记
01.Setup函数的体验 App.vue <template><div><h2>当前计数:{{ counter }}</h2><button click"increment">1</button><button click"decrement">-1</button></div> </template>&…...
NSS [HUBUCTF 2022 新生赛]checkin
NSS [HUBUCTF 2022 新生赛]checkin 判断条件是if ($data_unserialize[username]$username&&$data_unserialize[password]$password),满足则给我们flag。正常思路来说,我们要使序列化传入的username和password等于代码中的两个同名变量࿰…...
免费小程序HTTPS证书
随着互联网的快速发展,小程序已经成为人们日常生活中不可或缺的一部分。然而,在小程序的开发和使用过程中,安全问题一直是开发者们关注的重点。其中,HTTPS 证书是保障小程序安全的重要工具之一。在这方面,免费的小程序…...
Linux arm64异常简介和系统调用过程
文章目录 一、异常简介1.1 Exception levels1.2 异常类型 二、系统调用简介2.1 SVC指令2.2 VBAR2.3 系统调用保存现场2.4 系统调用返回 三、Linux 内核分析参考资料 一、异常简介 在ARM64体系架构中,异常是处理器在执行指令时可能遇到的不寻常情况或事件。这些异常…...
我遇到的最蠢的bug,竟然是因为这个原因……
bug的背景 我是一个Python开发者,我最近在做一个数据分析的项目,需要用到pandas库,来处理和分析一些表格数据我的功能需求是,根据用户输入的一些条件,从一个大的数据表中筛选出符合条件的数据,并生成一个新…...
【Mysql】查询mysql的版本
目录 cmd命令查询 mysql -- help(命令) mysql -u root -p(命令) 数据库管理工具查询 select version(); cmd命令查询 mysql -- help(命令) mysql -u root -p(命令) 执行该命令并且输入数据库密码 数据库管理工具查询 selec…...
广州华锐互动:VR互动实训内容编辑器助力教育创新升级
随着科技的飞速发展,教育领域也正在经历一场深刻的变革。其中,虚拟现实(VR)技术为教学活动提供了前所未有的便利和可能性。在诸多的VR应用中,VR互动实训内容编辑器无疑是最具潜力和创新性的一种。广州华锐互动开发的这款编辑器以其独特的功能…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
