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

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安装教程
      在这里插入图片描述
  • 编译成后点击上图中的 Open Project 进入 VS2019 中

    • F7 生成解决方案后报错如下,修改箭头处代码如图所示,保存后再次 F7 生成解决方案
      在这里插入图片描述

2.2 CEF 案例运行

  • 将 cefsimple 设置为启动项目,启动本地调试器,出现百度搜索界面
    • 注意修改下图代码中 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;
}
http://www.lryc.cn/news/225633.html

相关文章:

  • 基于arm-gcc 工具链开发mcu程序时,怎么便捷查看内存映像
  • 亚马逊云科技Zero ETL集成全面可用,可运行近乎实时的分析和机器学习
  • Java 设计模式——访问者模式
  • Mysql联合查询
  • 响应式婴幼儿早教启蒙网站模板源码
  • ChatGPT付费创作系统V2.4.9独立版 +WEB端+ H5端 + 小程序端系统测试安装教程
  • react 修改less文件后保存,内存溢出,项目崩溃问题解决
  • Lib文件和netlist的关系,DDC文件和netlist的区别
  • 万宾科技智能井盖,实现对井盖的监测
  • 使用Python从零实现多分类SVM
  • WPF ToggleButton 主题切换动画按钮
  • centerOS下docker 搭建IotDB集群
  • Vue3-Composition-API-学习笔记
  • NSS [HUBUCTF 2022 新生赛]checkin
  • 免费小程序HTTPS证书
  • Linux arm64异常简介和系统调用过程
  • 我遇到的最蠢的bug,竟然是因为这个原因……
  • 【Mysql】查询mysql的版本
  • 广州华锐互动:VR互动实训内容编辑器助力教育创新升级
  • 2023最新版本 从零基础入门C++与QT(学习笔记) -1- C++输入与输出
  • Linux:权限篇 (彻底理清权限逻辑!)
  • classification_report分类报告的含义
  • mysql with 的用法 (含 with recursive)
  • YOLOv8模型ONNX格式INT8量化轻松搞定
  • 揭秘南卡开放式耳机创新黑科技,核心技术剑指用户痛点
  • ChatRule:基于知识图推理的大语言模型逻辑规则挖掘11.10
  • 6.4翻转二叉树(LC226—送分题,前序遍历)
  • 【斗罗二】霍雨浩拿下满分碾压戴华斌,动用家族力量,海神阁会议
  • 通义千问, 文心一言, ChatGLM, GPT-4, Llama2, DevOps 能力评测
  • 一键创建PDF文档,高效管理您的文件资料