基于QtWebEngine和Web的监控系统报表组件开发方案
myzbx 2025-01-02 17:55 35 浏览
为满足换流站监控系统安防要求,许继电气股份有限公司的研究人员张浩然、赵冠华、申艳红、靳玮玮、张睿,在2020年第9期《电气技术》杂志上撰文,提出了基于Qt框架中的QtWebEngine模块,利用Web技术开发可在Linux上运行的C/S报表组件的技术方案。文中首先介绍了报表文件的格式定义,然后介绍了设计器和查看器的设计思路,并对其中关键的交互流程及实现方法进行了说明。
出于国家安全考虑,现在换流站监控系统要求运行在Linux系统上。现有的客户端/服务器(client/server, C/S)类专用报表组件如水晶报表等都是运行在Windows系统上的,在Linux上无法使用。在Linux上虽然有Open Office等办公套件,但是由于Linux上没有类似Windows上的对象连接与嵌入技术(object linking and embedding, OLE)的对象嵌入机制,所以也无法利用这些办公套件开发报表。
虽然现有的浏览器/服务器(browser/server, B/S)类报表组件可以运行在Linux系统上,但是使用B/S类报表,需要部署Web服务器。而变电站监控系统属于一区系统,按照二次安防要求,不能采用Web服务。因此,无法使用B/S类报表组件。故此,开发可以在Linux系统使用的C/S报表组件,势在必行。
本文提供了基于QtWebEngine模块,利用Web技术的报表组件开发方案。此方案既利用了Web页面的强大展示能力,又通过QtWebEngine与Web页面的交互能力避开了搭建Web服务器的需要,从而构建了一套强大灵活的C/S报表组件。以下对此技术方案的技术环节进行阐述。
1 背景技术介绍
QtWebEngine是Qt框架中的一个浏览器模块,它提供了易于使用且可扩展的应用程序接口(appli- cation programming interface, API)。利用QtWebEngine可以很容易地把Web内容嵌入到Qt应用程序中。QtWebEngine不允许C++/Qt代码直接操作页面元素。然而,QtWebEngine提供了RunJavaScript方法。可以通过该方法调用Web页面的JavaScript脚本,并获取执行结果,从而获取和调整页面内容。
QtWebEngine支持Web技术中最新的超文本标记语言(hyper text markup language, HTML)第五版标准。HTML5提供了一套拖放接口,使Web应用能够支持拖放功能。通过这些功能,用户可以使用鼠标选择可拖动元素,并将元素拖动到可放置容器,通过释放鼠标按钮来放置这些元素。
开发者可以自定义能够成为可拖拽的元素类型、可拖拽元素产生的反馈,以及可放置的容器元素。基于HTML5的拖放接口,可以实现报表的可视化设计。此外,Web技术中的高性能数据图表和数据表格也是报表开发中必需的功能。
2 模板文件设计
报表模板文件的本质是一个基于JavaScript对象表示法(Java script object notation, JSON)格式的文本文件,其内部保存了数据源和界面部件信息两部分数据。
2.1 数据源
数据源保存的并非真正在报表中使用的数据,而是报表要使用的数据点的编号和名称信息。当用户查看报表时,查看器会根据数据源中的数据点编号和用户选择的时间段,动态生成一个以数据点编号为列,以时间点为行的表格。这才是报表要使用的数据。数据源在报表模板中以JSON数组形式存储,如图1所示。
每个数组元素是一个JSON对象,对象内部由两个键值对组成,id代表数据点的编号,name代表数据点名称。
2.2 界面部件信息
报表界面部件信息包含了报表界面部件的布局关系和每个部件自身的属性设置。界面部件的布局关系可以用一个树形的结构表示,如图2所示。
整个报表作为根节点;在报表顶层的部件为第一级子节点;其中的容器类型节点可以拥有自己的子节点,容器类型节点可以嵌套。报表组件在展示报表时可以递归遍历这个树形结构来创建组件对象。
这个树形结构在报表模板中用嵌套的JSON对象来存储,如图3所示。
界面部件的结构定义如下:1)type,组件类型;2)id,组件编号;3)options,组件属性;4)list,组件的子节点列表。
加载报表模板文件后,设计器和查看器可以根据部件的type获取对应的类型,创建部件实例。在设计阶段,设计器可以通过部件id定位部件对象,以便更新部件属性设置和调整部件位置。
3 报表组件设计
报表组件分为设计器与查看器两个部分。设计器用于创建和编辑报表,由监控系统工程开发人员使用;查看器给运行人员使用,用于在线展示报表内容。设计器与查看器是相互独立的,但是在底层通过报表模板的格式定义相互影响,共享部分设计。
3.1 设计器
设计器内部的组件关系如图4所示。
由图4可以看出,Web页面内的主要组件有Widgets-list、Type-list、Report-from、Properties-editor、DataSource-editor和Store。
Widgets-list是一个提供了包含所有报表部件占位符的列表组件;Type-list是非可视化组件,提供了报表部件的类型定义;创建组件的时候,需要获取对应的组件类型,比如数据表格、数据图表,所以需要一个组件的类型映射表,根据组件的type获取对应的类型,创建实例。
Report-form代表了报表表单。Widgets-list内的部件占位符都被赋予HTML中的draggable属性,这样可以将部件占位符从Widgets-list拖到Report- form上。当一个部件占位符被从Widgets-list拖拽走时,Widgets-list会创建该占位符的一个复制品,供下次使用。
Report-form组件监听了drop事件。当部件占位符被拖到Report-form上时,会触发监测的drop事件。Report-form组件的事件处理器可以从事件参数中获取部件占位符,并提取出其携带的部件类型信息。然后Widget-builder根据部件类型信息从Type- lis获取完整的部件定义,并创建相应的部件实例。
Store组件管理数据源定义、报表结构信息、报表组件属性等内容。DataSource-editor组件用于编辑修改数据源定义。
Properties-editor组件用于编辑修改报表组件的属性,Store组件与Properties-editor组件、Report- form组件都是双向交互的。在Properties-editor组件中修改了组件属性,Store中的内容会相应改变,并且会改变Report-form中报表的显示。在Report-form中修改了报表的部件或布局时,Store中的信息会相应改变,在Properties-editor组件上显示的内容也会跟随变动。
报表设计器的Qt部分加载报表模板或创建一个内容为空的报表模板后,会执行RunJavaScript方法来调用Web侧的LoadReportTpl方法,将模板文件传递给Web侧。Web侧将报表模板解析后,先存入Store组件,然后由Report-form组件构建相应的报表部件并显示。
用户随后可以通过可视化方式对报表模板进行编辑,如配置数据源、添加修改图表/表格、设置图表/表格的关联数据点等。用户编辑完模板后,可以点击Qt侧的保存按钮,然后Qt侧执行RunJavaScript方法调用Web侧的SaveReportTpl方法,从Web侧获取报表模板。
3.2 查看器
查看器内部结构的组件关系如图5所示。
由图5可以看出,查看器Web页面内的主要组件有Type-list、Report-from和Store。查看器内的组件与设计器内同名组件的功能基本相同。不同之处在于,Store组件和Report-from的交互关系为单向。Web侧将报表模板解析后,先存入Store组件,然后由Report-form组件构建相应的报表部件并显示。Report-from不再对Store组件有影响。
查看器的组件关系相比设计器较为简单。然而,其工作流程却相对复杂。查看器的工作流程如图6所示。
由图6可以看出,报表查看器的工作流程如下:Qt部分负责加载报表模板;然后Qt侧通过RunJavaScript方法调用Web侧的LoadReportTpl方法,将报表模板文件传递给Web侧,由Web侧显示空的报表框架;同时Qt侧对报表模板进行解析,提取出其中的数据源设置;然后Qt侧根据解析出的数据源配置以及用户设置的时间段从服务器获取相应时间端的数据;Qt侧通过RunJavaScript方法调用Web侧的LoadDataSet方法,将报表要使用的数据集传递给Web侧;最后Web侧用数据集填充报表框架,将报表渲染出来。
4 结论
本文描述的报表组件开发方案,提供了可视化的报表设计工具,报表格式能够灵活定义,而且能够跨平台使用,充分满足变电站监控系统的安防需求。并且,报表组件基于QtWebEngine和Web技术开发,报表模板采用JSON格式定义,不依赖于第三方报表组件,具有良好的兼容性和通用性,易于应用到其他C/S架构的客户端系统中。
本技术方案也可供使用其他非Qt框架的监控系统做技术参考,只要使用的开发框架有可用的浏览器组件,即可采用类似的技术路线开发报表组件。
相关推荐
- 如何设计一个优秀的电子商务产品详情页
-
加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...
- 怎么在JS中使用Ajax进行异步请求?
-
大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
-
前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...
- 前端监控 SDK 开发分享_前端监控系统 开源
-
一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...
- Ajax 会被 fetch 取代吗?Axios 怎么办?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...
- 前端面试题《AJAX》_前端面试ajax考点汇总
-
1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...
- Ajax 详细介绍_ajax
-
1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
-
dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
-
接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
-
时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...
- 2021年超详细的java学习路线总结—纯干货分享
-
本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
-
Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
-
作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...
- 最贱超级英雄《死侍》来了!_死侍超燃
-
死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
-
一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
