目录

(放个目录方便预览。目录是从博客复制过来的,点击会跳转到博客)

  • 前言
  • 简介
  • Qt的Web方案
    • QtWebEngine的更新情况
    • WebEngine的架构
    • WebEngine的平台要求
      • Windows
      • MacOS
      • Linux
    • WebView
    • WebEngine的使用
      • WebEngine Widget最简Demo

        • 源代码
        • 运行结果
        • 最小发布包
      • WebEngine Qml最简Demo
        • 源码
        • 运行结果
        • 最小发布包
  • 下期预告

前言

《Qt与Web混合开发》系列文章,主要讨论Qt与Web混合开发相关技术。

这类技术存在适用场景,例如:Qt项目使用Web大量现成的组件/方案做功能扩展,

Qt项目中性能无关/频繁更新迭代的页面用html单独实现,Qt项目提供Web形式的SDK给

用户做二次开发等等,或者是Web开发人员齐全而Qt/C++人手不足,此类非技术问题,

都可以使用Qt + Web混合开发。

(不适用的请忽略本文)

简介

第一篇文章,会先整体介绍一下Qt的各种Web方案,再提供简单的Demo,并做一些简要的说明。

Qt的Web方案

Qt提供的Web方案主要包括 WebEngine/WebView、Quick WebGL Stream、QtWebAssembly三种。

  1. Quick WebGL Stream

可以参考Qt官方的WebGL Stream介绍文档

https://resources.qt.io/cn/qt-quick-webgl-release-512​resources.qt.io

WebGL Stream在5.12中正式发布,其本质是一种通信技术,将已有的QtQuick程序中渲染指令和数据,通过socket传输给Web端,由WebGL实现界面渲染。

其使用方式非常的简单,无需修改源码,应用程序启动时,带上端口参数,例如:

./your-qt-application -platform webgl:port=8998

(相当于应用程序变成了一个服务器端程序)

这样程序就在后端运行,看不到界面了,之后浏览器打开本地网址 localhost:8998 或者内网地址/映射后的公网地址,就能在浏览器中看到程序页面。

WebGL Stream的应用不多,Qt官方给的案例是:欧洲某工厂的大量传感器监测设备,都以WebGL Stream的方式运行Qt 程序,本身都不带显卡和显示器,而在控制中心的显卡/显示器上,通过Web打开网页的方式,查看每个设备的运行状况。因此节约了大量显卡/显示器的成本。类比于网吧的无硬盘系统。

涛哥相信,未来结合5G技术会有不错的应用场景。

2. WebAssembly

Qt WebAssembly技术,在5.13中正式发布。本质是把Qt程序编译成浏览器支持的二进制文件,由浏览器加载运行。

一方面可以将现有的Qt程序编译成Web,另一方面可以用Qt/C++来弥补Web程序的性能短板。

Qt WebAssembly在使用细节上还有一些坑的地方,需要踩一踩。后续我再写文章吧。

3. WebEngine/WebView

Qt提供了WebEngine模块以支持Web功能。

Qt WebEngine基于google的开源浏览器chromium实现,类似的项目还有cef、miniblink等等。

QtWebEngine可以看作是一个完整的chromium浏览器。

(WebView是同类的方案,稍微有些区别。后文再说。)

QtWebEngine的更新情况

浏览器技术十分的庞大,这里先不深入展开,先来关注一下Qt WebEngine对chromium的跟进情况。

数据来源于Qt wiki,Qt每个版本的change log

可以看到Qt在WebEngine模块,一直持续跟进Chromium的更新。

当前(2020/3/4)最新的chromium版本是80。

WebEngine的架构

QtWebEngine提供了C++和Qml的接口,可以在Widget/Qml中渲染HTML、XHTML、SVG,也支持CSS样式表和JavaScript脚本。

QtWebEngine的架构图如下

基于Chromium封装了一个WebEngineCore模块,在此之上,

WebEngine Widgets模块专门用于Widget项目,

WebEngine 模块用于Qml项目,

WebEngineProcess则是一个单独的进程,用来渲染页面、运行js脚本。

Web在单独的进程里,我们开发的时候知道这一点就好了,不需要额外关注,

只要在发布的时候,带上QTDIR目录下的可执行程序QtWebEngineProcess即可。

(这里提一下底层实现原理,使用了进程间共享OpenGL上下文的方式,

实现多个进程的UI混合在一起)

WebEngine的平台要求

(以Qt5.12为参考)

首先一条是:不支持静态编译 (因为依赖的chromium、chromium本身的依赖库 不能静态编译)

接下来再看看各平台的要求和限制:

Windows

编译器要 Visual Studio 2017 version 15.8 以上

系统环境要 Windows 10 SDK

默认只支持X64版本,如果要x86版本,要自己编译qt源码。

MacOS

  • MacOS 10.12以上
  • XCode 8.3.3以上
  • MacOS 10.12以上 SDK

不支持32-bit

不兼容 Mac App Store (chromium使用了私有api,App Sandbox和chromium Sandbox优先级问题)

Linux

编译器要 clang, 或者 gcc 5以上

需要pkg-config来探测依赖库,dbus-1和 fontconfig是必须的。

如果配置了xcb,还要额外配置相关库。

WebView

Qt还提供了一个WebView组件,可以用来将Web内容嵌入到Qml程序中。(这个没有提供Widget的接口)

WebView组件的实现,使用了平台原生api,在移动端意义重大,特别是在ios平台,使用

原生的web view,这样就能兼容App Store了。

在Windows/MacOS/Linux平台,则是渲染部分还是使用了WebEngine。

WebView的使用可以参考官方例子Minibrowser

WebEngine的使用

WebEngine Widget最简Demo

源代码

这里示例一个最简单的demo, 使用WebEngine Widget模块提供的QWebEngineView:

//Demo.pro

注意pro文件中包含的Qt模块

//main.cpp
#include <QApplication>
#include <QWebEngineView>
int main(int argc, char **argv)
{QApplication app(argc, argv);QWebEngineView view;view.load(QUrl("https://www.zhihu.com/"));view.show();return app.exec();
}

运行结果

上面代码以打开知乎首页为例,运行结果如下

最小发布包

涛哥尝试了在Windows平台,做出可用的最小发布包:

尺寸在160M左右。这些依赖项中,除了常见的Qt必备项platforms、Qt5Core、Qt5Gui等,

Qt5WebEngineCore是最大的一个,有70M。QtWebEngineProcess.exe是新增加的一个exe程序,

前文说架构图时提到的单独进程就是这个程序实现。

resources/icudtl.dat在其它浏览器引擎中也常看到。

translations/qtwebengine_locales是WebEngine的翻译项,不带可能会发生翻译问题。

Qt5Positioning、Qt5PrintSupport一般不怎么用,但是不带这两个程序起不来。

同时发现Qml和Quick模块也是必须的,Qt5QuickWidgets也用上了。

涛哥查看源码后发现WebEngineCore模块依赖Quick和Qml模块。

WebEngine Qml最简Demo

再做一个纯Qml的Demo

源码

pro中增加webengine模块即可

//WebQml.pro
QT += core gui quick qml webengineCONFIG += c++11SOURCES += main.cppRESOURCES += Qrc.qrc

注意初始化。

//main.cpp
#include <QGuiApplication>
#include <QQuickView>
#include <QtWebEngine>
int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication a(argc, argv);//初始化。时机在QApp之后,Window/View构造之前。QtWebEngine::initialize();QQuickView view;view.setSource(QUrl("qrc:/main.qml"));view.show();return a.exec();
}

qml导入模块,填入url

//main.qml
import QtQuick 2.0
import QtWebEngine 1.8
Item {width: 800height: 600WebEngineView {anchors.fill: parenturl: "https://www.zhihu.com"}
}

运行结果

运行结果和上一个Demo一样

最小发布包

这回可以去掉Widget模块

同时也去掉不必要的翻译文件。

多了一些Quick的模块文件。

包大小160M左右,和前面的差别不大。

转载声明

文章出自涛哥的博客 – 点击这里查看涛哥的博客

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 © 武威的涛哥

linux QT 结束当前进程_Qt与Web混合开发(一)--简单使用相关推荐

  1. linux里qt画直线_Qt与Web混合开发(一)简单使用

    前言 <Qt与Web混合开发>系列文章,主要讨论Qt与Web混合开发相关技术. 这类技术存在适用场景,例如:Qt项目使用Web大量现成的组件/方案做功能扩展, Qt项目中性能无关/频繁更新 ...

  2. linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集

    一.前言 数据源是组态软件的核心灵魂,少了数据源,组态就是个花架子没卵用,一般数据源有三种方式获取,串口.网络.数据库,至于数据规则是什么,这个用户自己指定,本设计器全部采用第一个字节作为数据来演示. ...

  3. linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?

    一.前言 为什么说QT越来越成为界面编程的第一选择,这要从当初为什么从MFC转到QT开始说.若想把MFC开发界面想做得好看一些是十分困难的一件事,引用第三方基于MFC的界面库代码也比较混乱,而当时看到 ...

  4. linux QT 结束当前进程_嵌入式linux编程开发必备知识

    嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...

  5. linux QT 结束当前进程_Linux常用使用命令梳理

    一.指定运行级别 运行级别 0:关机 1:单用户 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留状态 5:图形界面 6:重启系统 常用的运行级别是3和5,要想修改运行级别,可 ...

  6. linux QT 结束当前进程_Linux结束进程到底有多少种方法?

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习. 1. 前言 我们经常在Linux里使用kill命令来结束某后台进 ...

  7. linux定时结束java进程_使用zt-exec库定时清理linux休眠进程

    在几个月前上线的一个采集项目,构架是基于java + selenium + chromedriver + chrome实现的采集.至于为哈不直接用jsoup或httpclient实现采集功能,是因为很 ...

  8. linux 强制结束p进程的命令,Linux常用命令之性能命令

    本文介绍Linux常用性能统计分析命令,监控进程或者系统性能.主要包括CPU(top.mpstat).内存(vmstat.free).I/O(iostat).网络性能(sar).系统日志信息(dems ...

  9. linux系统结束vim进程的指令,Linux/Vim命令(持续更新)

    始终记住,命令行的四大要素:环境变量.可执行程序.工作路径.参数. 1.stdin stdout stderr 在操作系统中,每一个进程都绑定了三个文件,暨stdin.stdout.stderr,他们 ...

  10. Web前端开发工程师到底是干什么的?

    Web前端开发工程师其实是查BUG,改BUG,写BUG.哈哈,以上内容纯属开玩笑.事实上,Web前端开发工程师简单地说,就是使用HTML.CSS.JavaScript等技术来实现客户端(手机和电脑)上 ...

最新文章

  1. Lucene Document getBoost(float) 和 setBoost(float)
  2. 拼写检查工具是android,Android的文本和输入---拼写检查器(一)-Go语言中文社区...
  3. 远程安装Oracle Server
  4. [转]使用DBX分析AIX 下的 CoreDump
  5. 2017.10.19 起床困难综合征 思考记录
  6. python3—列表
  7. 力扣——合并K个排序链表
  8. Node.js:封装Node通用web容器
  9. 基于TP-LINK(AC1200)主路由器+FAST(FWR303)副路由器的桥接(中继)信号放大
  10. python爬虫requests设置代理ip_Python 爬虫的代理 IP 设置方法汇总
  11. oracle mysql迁移方案_Oracle/云MySQL/MsSQL“大迁移”真相及最优方案
  12. jetbrains intellij idea从2021.2.3版本开始需要用户登录之后才能使用,2021.2.2版本以及之前的版本不用登录
  13. 数据库存储手机emoji表情
  14. 如何用15秒打动对方
  15. 认知计算机系统和应用实验报告,计算机认知实习课实验报告.doc
  16. npm 如何更新项目最新依赖包
  17. 对python的认识作文500字_关于启示的作文500字
  18. 汽车车门振动变形测量
  19. 射频识别RFID:七个问题 让你看透RFID
  20. nyoj 1217 GLaDOS的耳机(线段树,开两个标记数组维护)

热门文章

  1. python爬取5442网站图片
  2. HappenBefore指令重排
  3. 2022年G1工业锅炉司炉考试试题及答案
  4. 我的人生观、爱情观和世界观
  5. 微信公众号的黑色商业链揭秘
  6. 10款值得收藏的网站数据实时分析工具
  7. 关于搞国外广告联盟的一些思路
  8. 让Win7系统下的硬盘不在狂闪的诀窍【mfxp】
  9. 2018-03-08,模板消息推送,全代码,多多指教
  10. JQuery——相关练习