前言
《Qt与Web混合开发》系列文章,主要讨论Qt与Web混合开发相关技术。
这类技术存在适用场景,例如:Qt项目使用Web大量现成的组件/方案做功能扩展,
Qt项目中性能无关/频繁更新迭代的页面用html单独实现,Qt项目提供Web形式的SDK给
用户做二次开发等等,或者是Web开发人员齐全而Qt/C++人手不足,此类非技术问题,
都可以使用Qt + Web混合开发。
(不适用的请忽略本文)
简介
第二篇文章,先介绍Qt与Web嵌套使用,再介绍Qt与Web分开使用,之后着重讨论分开使用的一些实现细节,特别是WebChannel通信、WebChannel在Web/typescript中的使用。
Qt与Web嵌套
MiniBrowser
这里以Qt官方的例子MiniBrowser来说明吧。
打开方式如下:
运行效果如下:
这个例子是在Qml中嵌套了WebView。
半透明测试
涛哥做了一个简单的半透明测试。
增加了两个半透明的小方块,蓝色的在WebView上面,红色的在WebView下面。
运行效果也是正确的:
代码是这样的:
红色框中是我增加的代码。
为什么要做半透明测试呢?根据以往的经验,不同渲染方式的两种窗口/组件嵌套在一起,总会出现透明失效之类的问题,例如 qml与Widget嵌套。
渲染原理
涛哥翻了一下Qt源码,了解到渲染的实现方式,Windows平台大致如下:
chromium在单独的进程处理html渲染,并将渲染结果存储在共享内存中;主窗口在需要重绘的时候,从共享内存中获取内容并渲染。
小结
这里的WebView内部封装好了WebEngine,其本身也是一个Item,就和普通的Qml一样,属性绑定、js function都可以正常使用,暂时不深入讨论了。
Qt与Web分离
Qt与Web分离,就是字面意思,Web在单独的浏览器或者App中运行,不和Qt堆在一起。两者通过socket进行通信。
这里用我自己做的例子来说明吧。
(...微信公众号把gif图片吃掉了...)
源码在github上: https://github.com/jaredtao/QtWeb
Qt小车
原版小车
小车来自Qt的D-Bus Remote Controller 例子
原版的例子,实现了通过QDBus 跨进程 控制小车。
(吐槽:这是一个古老的例子,使用了GraphicsView 和QDBus)
(知识拓展1:DBus是unix系统特有的一种进程间通信机制,使用有些复杂。
Qt对DBus机制进行了封装/简化,即QDBus模块,
通过xml文件的配置后,把DBus的使用转换成了信号-槽的形式。
类似于现在的Qt Remote Objects)
(知识拓展2:Windows本身不支持DBus,网上有socket模拟DBus的方案。
参考: freedesktop.org/wiki/So)
改进小车
我做了一些修改,主要如下:
去掉了DBus
增加控制按钮
增加WebChannel
修改Car的实现,导出一些属性和函数。
注册Car到WebChannel
这里贴一些关键代码
Car的头文件:
其中要说明的是:
speed和angle属性具备 读、写、change信号。
还有加速、减速、左转、右转四个