diff --git a/docs/bigscreen/index.html b/docs/bigscreen/index.html index 83f6cc3..040eea5 100644 --- a/docs/bigscreen/index.html +++ b/docs/bigscreen/index.html @@ -1,8 +1,754 @@ - +
- - -V20220417
V20211015
V20210323
系统支持多种数据源,比如数据库采集、http请求、串口通信、网络通信、模拟数据等,为了简化测试过程,默认内置采用的是模拟数据。
系统内置了多种启动窗体,默认大屏系统,可以通过鼠标右键菜单进入系统设置,启动窗体下拉框选择进行切换,切换后会自动重启应用,还可选择控件演示、模块演示,在控件演示和模块演示窗体中,左侧是对应子窗体导航,会自动记住最后选中的子界面索引。
+ 



+ 
在大屏的顶部中间标题栏或者子模块以外的标题栏,鼠标右键弹出的是系统的菜单,包括布局切换和样式切换等。
+ 
在模块的标题栏,鼠标右键弹出的是模块可视化的菜单,这个是Qt内置生成的,加载了多少个子模块就会生成多少个菜单项,可以对每个模块进行显示隐藏切换。
在弹出的系统菜单选择布局方案,在弹出的二级菜单选择默认已经设置好的布局方案,直接切换即可。
在弹出的系统菜单选择新建布局,在弹出的框中输入布局名称,确认后,自由拖动调整模块位置,打开模块、隐藏模块,之后单击保存布局即可。
在弹出的系统菜单选择配色方案,在弹出的二级菜单选择对应的配色方案,默认有四种:紫色风格、蓝色风格、深蓝风格、黑色风格。
鼠标移动到子模块的标题栏,鼠标按下可以拖动这个模块到任意位置,模块也可以拖动独立位置展示,也可以嵌入到对应布局中,拖动好位置以后自动保存到布局方案,下次启动自动应用。双击模块标题栏可以剥离窗体使之悬浮。
鼠标移动到模块与模块的边缘,鼠标变成调整间距样式,可以左右或者上下拉动,调整好间距以后自动保存到布局方案,下次启动自动应用。

系统设置中的参数,可能会不定期做调整和修改及增加,下面的图示和参数描述未必全部一致,以最新的为准。

参数说明

参数说明
1QStringList listVideoUrl;2//本地视频文件3listVideoUrl << "f:/mp5/1.mp4";4//USB摄像头-默认5listVideoUrl << "video=USB2.0 PC CAMERA";6//USB摄像头-指定分辨率和帧率7listVideoUrl << "video=USB Video Device|1280x720|30";8//网络摄像机地址-大华9listVideoUrl << "rtsp://admin:12345@192.168.1.15:554/media/video1";10//网络摄像机地址-海康11listVideoUrl << "rtsp://admin:Admin123456@192.168.1.64:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_2";12//网络视频流地址-美国13listVideoUrl << "http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4";14//网络视频流地址-中国15listVideoUrl << "http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4";16//网络视频流地址-海康萤石17listVideoUrl << "https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8"; 
采集间隔设置不用做说明,一看就懂,单位毫秒,可定制每个模块都对应自己的采集方式、数据库、间隔等。

理论上支持Qt支持的所有数据库,和具体程序无关,只要有对应的数据库的动态库和插件库就行,或者支持odbc数据源也可以,程序打通了odbc数据源的通信方式,所以支持各种数据库,可以先自己用对应的数据库工具连接数据库试试,通了数据库正常后在来测试程序。
亲测 Sqlite(Qt内置无需额外动态库)、MySql(高版本Qt需要自行编译插件)、PostgreSQL(开源免费的数据库,很好用)、SqlServer(需要设置ODBC数据源)、kingbase(国产人大金仓数据库,该数据库其实是基于PostgreSQL改的,通过odbc数据源方式测试无误)。
连接测试用来测试当前选择的数据库类型以及数据库信息,是否能连接数据库正常,可以避免数据库不通的情况下用来检测是否信息填写正确。
初始化数据库按钮用来执行sql脚本来生成对应的数据库,部分数据库支持数据库文件不存在的情况下通过sql语句来创建数据库,比如mysql、postgres等就支持直接sql语句新建数据库,有部分数据库可能不支持,需要手动先在数据库管理工具中新建好数据库,然后再来这里执行初始化数据库用来新建表和初始数据。
本系统支持多种工作模式,以便适应各种需求,默认采用随机模拟数据,大屏基础版本也采用此工作模式。
x1void frmModule1::loadPlot1()2{3 //对应表名(返回的时候充当唯一标识符flag)和字段名4 QString tableName = "t_1_1_mold_prod_total";5 QString columnName = "name,prod_1,prod_2";6
+7 //模拟数据采用随机数据 其他采用调用函数接口查询和请求数据8 if (AppConfig::WorkMode == "timer") {9 double min = 1, max = 50;10 vdouble value1, value2;11 for (int i = 0; i < rowNames1.count(); ++i) {12 value1 << QUIHelper::getRandValue(min, max);13 value2 << QUIHelper::getRandValue(min, max);14 }15 loadPlot1(lvdouble() << value1 << value2);16 } else if (AppConfig::WorkMode == "db") {17 DbData::DbLocal->select(tableName, columnName, true);18 } else if (AppConfig::WorkMode == "http") {19 DbData::DbHttp->select(tableName, columnName, true);20 }21}如果工作模式选择的是模拟数据,则采用随机数模拟生成数据并设置。
具体数据库表字段说明参见后面的数据库说明。
如果工作模式选择的是数据库采集,则会自动连接设置的数据库,可以用对应的数据库管理工具连接数据库,打开对应的表,然后更改其中的数据,保存,可看到对应的数据反应到界面上。
系统支持一个系统下的软件远程访问另一个系统下的数据库,比如linux系统或者mac系统远程访问win系统上的mysql数据库,数据库也可以放在云端比如阿里云(亲测无误),只要对应IP和端口可达就行,验证是否可达可以用对应的数据库管理工具连接即可。
理论上odbc的方式支持多种数据库,比如sql server,oracle,postgresql等,所以如果没有插件支持的数据库可以考虑用odbc的方式,odbc也是跨平台的。
如果需要远程访问mysql数据库,mysql数据库需要设置用户 root@%
+
+sql server数据库的配置规则,下面的链接只是参考,基本上正常电脑安装好以后都不需要下面的配置。
+https://blog.csdn.net/mozhi111/article/details/80281388
+https://blog.csdn.net/happymagic/article/details/8673476
远程访问sql server数据库,需要在运行软件的电脑上也需要配置数据源,不然很可能无法访问。
sql server数据库配置步骤
安装PostgreSQL数据库之后,默认只能本地访问连接。如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置。
+https://blog.csdn.net/weixin_36816337/article/details/81739819
+
+人大金仓数据库kingbase,其实就是postgresql数据库改的,如果是WIN10系统建议安装在系统盘以外,不然没有权限,导致奇奇怪怪的问题。
特别提示
需要定制协议,比如RS232、RS485、Modbus、Mqtt等
需要定制协议,比如tcp client、tcp server、udp client、udp server、websocket等。

找到bigscreen可执行文件所在目录下的httpserver文件,双击运行,切换到网络请求服务器页面,回复数据选择文件内容,单击启动服务器,左侧消息栏可以看到实时打印的数据,从json文件读取的数据,实际中可以是从数据库中采集的数据等。网络请求客户端/服务器工具httpserver,也是纯Qt编写的工具。
功能特点
请求地址:http://127.0.0.1:6000 可以自行在系统设置中更改。
其他表请求格式完全一致。 +tag=t_1_1_mold_prod_total&tableName=t_1_1_mold_prod_total&columnName=name,prod_1,prod_2
| 名称 | 说明 |
|---|---|
| tag | 标识符,用于服务端接收到请求后按照这个标识符返回数据,这里内容填的是具体的表名,方便收到数据直接解析并发送信号到对应模块窗体显示数据。 |
| tableName | 要查询的表名。 |
| columnName | 对应表的字段名称集合,用英文逗号隔开。 |
xxxxxxxxxx191{2 "tag": "t_1_1_mold_prod_total",3 "result": [{4 "internal_id": 1,5 "name": "设变",6 "prod_1": 16,7 "prod_2": 128 }, {9 "internal_id": 2,10 "name": "修模",11 "prod_1": 20,12 "prod_2": 2513 }, {14 "internal_id": 3,15 "name": "新模",16 "prod_1": 40,17 "prod_2": 2518 }]19}| 名称 | 说明 |
|---|---|
| tag | 唯一标识符,用于标识当前接收到哪个请求的回复数据,对方请求的时候会发过来。 |
| result | 结果数组,内容按照表格行一行行包装的数据。 |
客户端发送请求,指定了唯一标识符+表名+要查询的字段名称集合,服务器收到请求后,解析表名+字段名称集合,从数据库中查询对应的内容组成json字符串返回,带上唯一标识符。
具体解析数据在datahttp类中,如果是自定义的表和字段,则需要在datahttp类中的initTable方法自行添加表名和字段名即可,非常方便,一个表只需要增加一行代码。
现在数据采集无论是数据库采集还是网络请求采集,对应的表名和字段名都是写死在代码中,尽管目前已经封装好了可以自行添加表和字段,但是还不够通用,后期打算通过从配置文件读取。
数据库表的设计按照模块的顺序,比如frmmodule1主模块中包括4个子模块,每个子模块都对应一个表,所有表名的前缀是 t_ 以便区分,第一个数字表示主模块编号,第二个数字表示子模块编号。
表名格式如下:
源码目录下的bigscreen.sql为数据库脚本,可以在系统设置中单击初始化数据来执行。 +如果是需要对接自己的系统,可能涉及到部分数据不一致的情况,你可以: +第一:尽量用现有的表,现有的表各种各样都有,你找到你类似的往里面填数据就行。 +第二:如果没有合适的表,则需要调整对应的模块代码。

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 模具产量 | t_1_1_mold_prod_total |
| 每月模具产量趋势图 | t_1_2_mold_prod_monthly |
| 零件产量 | t_1_3_wp_prod_total |
| 每月零件产量趋势图 | t_1_4_wp_prod_monthly |

表名:t_1_1_mold_prod_total
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| name | 名称 | VARCHAR | 255 | 不为空 |
| prod_1 | 系列1 | INTEGER | 11 | |
| prod_2 | 系列2 | INTEGER | 11 |
默认数据:
| internal_id | name | prod_1 | prod_2 |
|---|---|---|---|
| 1 | 设变 | 14 | 12 |
| 2 | 修模 | 20 | 25 |
| 3 | 新模 | 40 | 25 |

表名:t_1_2_mold_prod_monthly
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| year | 年份 | INTEGER | 4 | 不为空 |
| month | 月份 | INTEGER | 4 | 不为空 |
| prod_1 | 系列1 | INTEGER | 11 | |
| prod_2 | 系列2 | INTEGER | 11 | |
| prod_3 | 系列3 | INTEGER | 11 |
默认数据:
| internal_id | year | month | prod_1 | prod_2 | prod_3 |
|---|---|---|---|---|---|
| 1 | 2018 | 5月 | 32 | 54 | 80 |
| 2 | 2018 | 6月 | 42 | 34 | 33 |
| 3 | 2018 | 7月 | 45 | 62 | 44 |
| 4 | 2018 | 8月 | 23 | 38 | 65 |
| 5 | 2018 | 9月 | 12 | 12 | 77 |
| 6 | 2018 | 10月 | 22 | 33 | 34 |
| 7 | 2018 | 11月 | 23 | 45 | 22 |
| 8 | 2018 | 12月 | 32 | 65 | 43 |
| 9 | 2019 | 1月 | 12 | 23 | 65 |
| 10 | 2019 | 2月 | 21 | 77 | 55 |
| 11 | 2019 | 3月 | 22 | 87 | 33 |
| 12 | 2019 | 4月 | 23 | 45 | 34 |

表名:t_1_3_wp_prod_total
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| name | 名称 | VARCHAR | 255 | 不为空 |
| prod_1 | 系列1 | INTEGER | 11 | |
| prod_2 | 系列2 | INTEGER | 11 |
默认数据:
| internal_id | name | prod_1 | prod_2 |
|---|---|---|---|
| 1 | 其他 | 8544 | 10000 |
| 2 | 钢件 | 1000 | 5002 |
| 3 | 电极 | 2000 | 3000 |

表名:t_1_4_wp_prod_monthly
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| year | 年份 | INTEGER | 4 | 不为空 |
| month | 月份 | INTEGER | 4 | 不为空 |
| prod_1 | 系列1 | INTEGER | 11 | |
| prod_2 | 系列2 | INTEGER | 11 | |
| prod_3 | 系列3 | INTEGER | 11 |
默认数据:
| internal_id | year | month | prod_1 | prod_2 | prod_3 |
|---|---|---|---|---|---|
| 1 | 2018 | 5月 | 32 | 54 | 23 |
| 2 | 2018 | 6月 | 42 | 34 | 30 |
| 3 | 2018 | 7月 | 45 | 62 | 44 |
| 4 | 2018 | 8月 | 23 | 38 | 65 |
| 5 | 2018 | 9月 | 12 | 12 | 77 |
| 6 | 2018 | 10月 | 22 | 33 | 34 |
| 7 | 2018 | 11月 | 23 | 45 | 22 |
| 8 | 2018 | 12月 | 32 | 65 | 43 |
| 9 | 2019 | 1月 | 12 | 23 | 65 |
| 10 | 2019 | 2月 | 21 | 77 | 55 |
| 11 | 2019 | 3月 | 22 | 87 | 33 |
| 12 | 2019 | 4月 | 23 | 45 | 34 |

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 模具达成率 | t_2_1_mold_achie_rate |
| 零件达成率 | t_2_2_wp_achie_rate |
| 零件数 | t_2_3_wp_achie_number |
| 每日工序达成数 | t_2_4_process_achie_number |

表名:t_2_1_mold_achie_rate
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| plan | 计划数 | INTEGER | 11 | |
| achieved | 达成数 | INTEGER | 11 |
默认数据:1 200 110

表名:t_2_2_wp_achie_rate
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| name | 名称 | VARCHAR | 255 | 不为空 |
| plan | 计划数 | INTEGER | 11 | |
| achieved | 达成数 | INTEGER | 11 |
默认数据:
| internal_id | name | plan | achieved |
|---|---|---|---|
| 1 | 模仁 | 100 | 200 |
| 2 | 镶件 | 122 | 100 |
| 3 | 辅件 | 300 | 500 |
| 4 | 电极 | 155 | 200 |

表名:t_2_3_wp_achie_number
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| wp_achie_number | 零件数 | INTEGER | 11 |
默认数据:1 1234

表名:t_2_4_process_achie_number
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| day | 日期 | VARCHAR | 2 | |
| green | 绿色数量 | INTEGER | 11 | |
| blue | 蓝色数量 | INTEGER | 11 | |
| red | 红色数量 | INTEGER | 11 |
默认数据:
| internal_id | day | green | blue | red |
|---|---|---|---|---|
| 1 | 1 | 20 | 3 | 0 |
| 2 | 2 | 20 | 2 | 0 |
| 3 | 3 | 23 | 3 | 0 |
| 4 | 4 | 32 | 4 | 0 |
| 5 | 5 | 43 | 5 | 0 |
| 6 | 6 | 23 | 3 | 0 |
| 7 | 7 | 44 | 0 | 5 |
| 8 | 8 | 12 | 0 | 5 |
| 9 | 9 | 54 | 0 | 4 |
| 10 | 10 | 42 | 0 | 3 |
| 11 | 11 | 47 | 6 | 0 |
| 12 | 12 | 34 | 4 | 0 |
| 13 | 13 | 25 | 3 | 0 |
| 14 | 14 | 38 | 6 | 0 |
| 15 | 15 | 43 | 0 | 4 |
| 16 | 16 | 56 | 0 | 3 |
| 17 | 17 | 65 | 4 | 0 |
| 18 | 18 | 43 | 5 | 0 |
| 19 | 19 | 34 | 0 | 5 |
| 20 | 20 | 55 | 3 | 0 |
| 21 | 21 | 47 | 6 | 0 |
| 22 | 22 | 34 | 4 | 0 |
| 23 | 23 | 25 | 3 | 0 |
| 24 | 24 | 38 | 6 | 0 |
| 25 | 25 | 43 | 0 | 4 |
| 26 | 26 | 56 | 0 | 3 |
| 27 | 27 | 65 | 4 | 0 |
| 28 | 28 | 43 | 5 | 0 |
| 29 | 29 | 34 | 0 | 5 |
| 30 | 30 | 55 | 3 | 0 |
| 31 | 31 | 42 | 0 | 3 |

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 设备运行状态 | t_3_1_device_runtime |
| 稼动率 | t_3_2_oee |

表名:t_3_1_device_runtime
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| group_name | 分组名称 | VARCHAR | 4 | 不为空 |
| no_id | 分组编号 | INTEGER | 11 | 不为空 |
| name | 名称 | VARCHAR | 255 | 不为空 |
| text_1 | 文字1 | VARCHAR | 255 | |
| text_2 | 文字2 | VARCHAR | 255 | |
| status | 状态 1-开机 2-待机 3-维护 4-空 | INTEGER | 1 | 不为空 |
| progress | 进度 | INTEGER | 3 | |
| flicker | 是否闪烁 | INTEGER | 1 |
默认数据:
| internal_id | group_name | no_id | name | text_1 | text_2 | status | progress | flicker |
|---|---|---|---|---|---|---|---|---|
| 1 | CNC | 1 | CNC1 | 190411 | PID11 | 1 | 0 | 0 |
| 2 | CNC | 2 | CNC2 | 190412 | PID12 | 1 | 0 | 0 |
| 3 | CNC | 3 | CNC3 | 190413 | PID13 | 1 | 0 | 0 |
| 4 | CNC | 4 | CNC4 | 190414 | PID14 | 2 | 0 | 0 |
| 5 | CNC | 5 | CNC5 | 190415 | PID15 | 1 | 0 | 0 |
| 6 | CNC | 6 | CNC6 | 190416 | PID16 | 2 | 0 | 0 |
| 7 | CNC | 7 | CNC7 | 190417 | PID17 | 1 | 0 | 0 |
| 8 | CNC | 8 | 4 | 0 | 0 | |||
| 9 | EDM | 1 | EDM1 | 190421 | PID21 | 1 | 0 | 0 |
| 10 | EDM | 2 | EDM2 | 190422 | PID23 | 2 | 0 | 0 |
| 11 | EDM | 3 | EDM3 | 190423 | PID23 | 1 | 0 | 0 |
| 12 | EDM | 4 | EDM4 | 190424 | PID24 | 3 | 0 | 0 |
| 13 | EDM | 5 | EDM5 | 190425 | PID25 | 1 | 0 | 0 |
| 14 | EDM | 6 | EDM6 | 190426 | PID26 | 1 | 0 | 0 |
| 15 | EDM | 7 | EDM7 | 190427 | PID27 | 1 | 0 | 0 |
| 16 | EDM | 8 | EDM8 | 190428 | PID28 | 2 | 0 | 0 |
| 17 | WEDM | 1 | WEDM1 | 190431 | PID28 | 1 | 0 | 0 |
| 18 | WEDM | 2 | WEDM2 | 190432 | PID28 | 3 | 0 | 0 |
| 19 | WEDM | 3 | WEDM3 | 190434 | PID29 | 2 | 0 | 0 |
| 20 | WEDM | 4 | WEDM4 | 190435 | PID30 | 1 | 0 | 0 |
| 21 | WEDM | 5 | WEDM5 | 190436 | PID36 | 1 | 0 | 0 |
| 22 | WEDM | 6 | WEDM6 | 190437 | PID37 | 3 | 0 | 0 |
| 23 | WEDM | 7 | 4 | 0 | 0 | |||
| 24 | WEDM | 8 | 4 | 0 | 0 |

表名:t_3_2_oee
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| cnc | 类别-cnc | INTEGER | 3 | 不为空 |
| edm | 类别-edm | INTEGER | 3 | 不为空 |
| wedm | 类别-wedm | INTEGER | 3 | 不为空 |
默认数据:1 110 90 90

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 模具进度 | t_4_1_mold_progress |
| 模具状态统计 | t_4_2_mold_status_parcent |
| 加工中模具数量 | t_4_3_mold_processing_num |

表名:t_3_2_oee
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| mold_no | 模具编号 | VARCHAR | 11 | |
| tn_no | 版本号 | VARCHAR | 11 | |
| type | 类型 | VARCHAR | 255 | |
| status | 状态 | VARCHAR | 255 | |
| product_name | 产品名称 | VARCHAR | 255 | |
| plan_date | 计划交期 | VARCHAR | 255 | |
| green | 当前进度绿色 | INTEGER | 11 | |
| yellow | 当前进度黄色 | INTEGER | 11 | |
| red | 当前进度红色 | INTEGER | 11 |
默认数据:
| internal_id | mold_no | tn_no | type | status | product_name | plan_date | green | yellow | red |
|---|---|---|---|---|---|---|---|---|---|
| 1 | IK19001 | T0 | 新模 | 加工中 | 后盖 | 2019/3/29 | 60 | 20 | 20 |
| 2 | IK19002 | T1 | 修模 | 加工中 | 前盖 | 2019/4/3 | 50 | 50 | 0 |
| 3 | IK29003 | T2 | 修模 | 加工中 | 外壳 | 2019/4/8 | 30 | 70 | 0 |
| 4 | IK19004 | T0 | 新模 | 加工中 | 侧边 | 2019/4/18 | 90 | 5 | 5 |
| 5 | IK19005 | T3 | 修模 | 加工中 | 边框 | 2019/4/3 | 60 | 40 | 0 |
| 6 | IK19006 | T0 | 新模 | 加工中 | 后盖 | 2019/4/26 | 70 | 25 | 5 |
| 7 | IK19007 | T0 | 新模 | 加工中 | 面板 | 2019/4/7 | 25 | 25 | 50 |
| 8 | IK19008 | T0 | 新模 | 加工中 | 插件 | 2019/3/31 | 20 | 40 | 40 |
| 9 | IK19009 | T1 | 修模 | 加工中 | 面板 | 2019/3/12 | 10 | 60 | 30 |
| 10 | IK19010 | T2 | 修模 | 加工中 | 后盖 | 2019/2/12 | 0 | 100 | 0 |

表名:t_4_2_mold_status_parcent
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| finished | 正常交付百分比 | INTEGER | 11 | 不为空 |
| processing | 加工中百分比 | INTEGER | 11 | 不为空 |
| delay | 延期百分比 | INTEGER | 11 | 不为空 |
默认数据: +1 60 25 15

表名:t_4_3_mold_processing_num
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| mold_processing_number | 加工中数量 | INTEGER | 11 | 不为空 |
默认数据:87

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 工序计划负荷 | t_5_1_work_load |
| 当日负荷 | t_5_2_work_load_today |
| 负荷百分比 | t_5_3_work_load_percent |

表名:t_5_1_work_load
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| process_name | 工序名称 | VARCHAR | 255 | |
| work_load_1 | 第1天负荷 | VARCHAR | 255 | |
| work_load_x | 第x天负荷 | VARCHAR | 255 | |
| work_load_7 | 第7天负荷 | VARCHAR | 255 |
默认数据:
| internal_id | process_name | work_load_1 | work_load_2 | work_load_3 | work_load_4 | work_load_5 | work_load_6 | work_load_7 |
|---|---|---|---|---|---|---|---|---|
| 1 | CNC粗 | 101H | 81H | 90H | 120H | 30H | 60H | 120H |
| 2 | CNC精 | 102H | 102H | 120H | 81H | 45H | 102H | 81H |
| 3 | EDM | 77H | 102H | 90H | 102H | 45H | 90H | 120H |
| 4 | WEDM | 87H | 102H | 120H | 45H | 102H | 102H | 90H |
| 5 | 抛光 | 45H | 102H | 102H | 90H | 81H | 81H | 81H |
| 6 | 钳工 | 89H | 90H | 45H | 120H | 120H | 120H | 102H |
| 7 | 组装 | 77H | 90H | 81H | 102H | 45H | 102H | 81H |
表名:t_5_1_work_load_table_head +这个设计很巧妙,相当于动态的日期和数据,日期作为标题。
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| date_1 | 第1天日期 | VARCHAR | 255 | |
| date_2 | 第2天日期 | VARCHAR | 255 | |
| date_3 | 第3天日期 | VARCHAR | 255 | |
| date_4 | 第4天日期 | VARCHAR | 255 | |
| date_5 | 第5天日期 | VARCHAR | 255 | |
| date_6 | 第6天日期 | VARCHAR | 255 | |
| date_7 | 第7天日期 | VARCHAR | 255 |
默认数据:
| internal_id | date_1 | date_2 | date_3 | date_4 | date_5 | date_6 | date_7 |
|---|---|---|---|---|---|---|---|
| 1 | 2019-04-30 | 2019-05-01 | 2019-05-02 | 2019-05-03 | 2019-05-04 | 2019-05-05 | 2019-05-06 |

表名:t_5_2_work_load_today
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| group_name | 分组名称 | REAL | 11 | 小数位精度1 |
| green | 绿色值 | REAL | 11 | 小数位精度1 |
| red | 红色值 | REAL | 11 | 小数位精度1 |
默认数据:
| internal_id | group_name | green | red |
|---|---|---|---|
| 1 | CNC粗 | 20 | 20 |
| 2 | CNC精 | 40 | 20 |
| 3 | EDM | 60 | 0 |
| 4 | WEDM | 30.2 | 2 |
| 5 | 铣床 | 40 | 0 |
| 6 | 磨床 | 30 | 50 |

表名:t_5_3_work_load_percent
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| group_name | 分组名称 | VARCHAR | 255 | |
| day_1 | 第1天 | INTEGER | 3 | |
| day_x | 第x天 | INTEGER | 3 | |
| day_7 | 第7天 | INTEGER | 3 |
默认数据:
| internal_id | group_name | day_1 | day_2 | day_3 | day_4 | day_5 | day_6 | day_7 |
|---|---|---|---|---|---|---|---|---|
| 1 | CNC粗 | 70 | 80 | 90 | 70 | 50 | 99 | 80 |
| 2 | CNC精 | 120 | 100 | 130 | 140 | 90 | 100 | 85 |
| 3 | EDM | 120 | 100 | 120 | 80 | 90 | 40 | 50 |
| 4 | WEDM | 100 | 120 | 120 | 100 | 100 | 80 | 70 |
| 5 | 铣床 | 90 | 80 | 75 | 40 | 12 | 30 | 10 |
| 6 | 磨床 | 80 | 70 | 50 | 60 | 40 | 50 | 30 |

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 钢件合格率 | t_6_1_wp_qual_rate |
| 电极合格率 | t_6_2_ele_qual_rate |
| 当天合格率 | t_6_3_qual_rate_today |
| 模具零件合格率 | t_6_4_mold_qual_rate |

表名:t_6_1_wp_qual_rate
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| date_1 | 第1天合格率 | INTEGER | 3 | |
| date_x | 第x天合格率 | INTEGER | 3 | |
| date_15 | 第15天合格率 | INTEGER | 3 |
默认数据: +1, 100, 99, 89, 95, 95, 92, 98, 100, 96, 97, 98, 99, 90, 85, 84

表名:t_6_2_ele_qual_rate
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| date_1 | 第1天合格率 | INTEGER | 3 | |
| date_x | 第x天合格率 | INTEGER | 3 | |
| date_15 | 第15天合格率 | INTEGER | 3 |
默认数据: +1, 100, 99, 89, 95, 95, 92, 98, 100, 96, 97, 98, 99, 90, 85, 84

表名:t_6_3_qual_rate_today
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| qual_rate | 合格率 | INTEGER | 3 |
默认数据:90

表名:t_6_4_mold_qual_rate
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| mold_name | 模块名称 | VARCHAR | 255 | |
| qual_rate | 合格率 | INTEGER | 3 |
默认数据:
| internal_id | mold_name | qual_rate |
|---|---|---|
| 1 | IK19001 | 95 |
| 2 | IK19002 | 88 |
| 3 | IK19003 | 94 |
| 4 | IK19004 | 75 |
| 5 | IK19005 | 94 |
| 6 | IK19006 | 89 |

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 品质占比 | t_7_1_qual_percent |
| 班组合格率 | t_7_2_group_qual_rate |
| 每日合格率统计 | t_7_3_qual_rate_daily |

表名:t_7_1_qual_percent
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| green | 绿色百分比 | INTEGER | 3 | |
| blue | 蓝色百分比 | INTEGER | 3 | |
| yellow | 黄色百分比 | INTEGER | 3 | |
| red | 红色百分比 | INTEGER | 3 |
默认数据: +1 45 30 15 10

表名:t_7_2_group_qual_rate
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| group_name | 分组名称 | VARCHAR | 255 | |
| qual_rate | 合格率 | INTEGER | 3 |
默认数据:
| internal_id | group_name | qual_rate |
|---|---|---|
| 1 | CNC | 90 |
| 2 | EDM | 85 |
| 3 | WEDM | 92 |
| 4 | 磨床 | 94 |
| 5 | 铣床 | 93 |
| 6 | 外协 | 92 |

表名:t_7_3_qual_rate_daily
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| group_name | 分组名称 | VARCHAR | 255 | |
| day_1 | 第1天 | INTEGER | 3 | |
| day_x | 第x天 | INTEGER | 3 | |
| day_31 | 第31天 | INTEGER | 3 |
默认数据: +1, 'all', 90, 90, 97, 91, 92, 88, 89, 90, 78, 87, 86, 90, 80, 97, 87, 87, 88, 89, 90, 90, 89, 86, 90, 80, 97, 87, 87, 89, 89, 89, 90

子模块表名对应表:
| 子模块标题 | 子模块表名 |
|---|---|
| 库存占比 | t_8_1_key_invt |
| 主要零件库存 | t_8_2_invt_table |

表名:t_8_1_key_invt
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| name | 名称 | VARCHAR | 255 | |
| upper_bound | 上限 | INTEGER | 11 | |
| current | 库存 | INTEGER | 11 |
默认数据:
| internal_id | name | upper_bound | current |
|---|---|---|---|
| 1 | 刀具A1 | 200 | 110 |
| 2 | 顶针B | 100 | 70 |
| 3 | 线割丝C | 100 | 300 |
| 4 | 树脂D | 100 | 10 |

表名:t_8_2_invt_table
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| internal_id | 序号 | INTEGER | 11 | 主键自增 |
| invt_no | 编号 | VARCHAR | 255 | |
| name | 品名 | VARCHAR | 255 | |
| spec | 规格 | VARCHAR | 255 | |
| mat | 材料 | VARCHAR | 255 | |
| size | 尺寸 | VARCHAR | 255 | |
| target | 目标库存 | INTEGER | 11 | |
| current | 当前库存 | INTEGER | 11 |
默认数据:
| internal_id | invt_no | name | spec | mat | size | target | current |
|---|---|---|---|---|---|---|---|
| 1 | SSDDS1 | 品名1 | 规格1 | 材料1 | 345420 | 200 | 90 |
| 2 | SSDDS2 | 品名2 | 规格2 | 材料2 | 345420 | 100 | 120 |
| 3 | SSDDS3 | 品名3 | 规格3 | 材料3 | 345420 | 100 | 67 |
| 4 | SSDDS4 | 品名4 | 规格4 | 材料4 | 345420 | 100 | 88 |
| 5 | SSDDS5 | 品名5 | 规格5 | 材料5 | 345420 | 100 | 45 |
| 6 | SSDDS6 | 品名6 | 规格6 | 材料6 | 345420 | 100 | 87 |
| 7 | SSDDS7 | 品名7 | 规格7 | 材料7 | 345420 | 100 | 9 |
| 8 | SSDDS8 | 品名8 | 规格8 | 材料8 | 345420 | 100 | 44 |
| 9 | SSDDS9 | 品名9 | 规格9 | 材料9 | 345420 | 100 | 100 |
| 字段 | 描述 | 默认值 |
|---|---|---|
| IndexStart | 启动窗体索引 0-大屏系统 1-控件演示 2-模块演示 | 0-大屏系统 |
| IndexControl | 控件演示窗体选中子窗体索引 | 0 |
| IndexModule | 模块演示窗体选中子窗体索引 | 0 |
| WorkMode | 工作模式 | timer |
| MapStyle | 中间地图样式 | point |
| Title | 软件标题,默认值:数字化工厂信息中心 | |
| Ratio | 分辨率,目前无意义,备用参数 | 1920*1080 |
| Layout | 布局方案,每次切换布局方案以后都会保存 | 完整布局 |
| Theme | 配色方案,每次切换配色方案以后都会保存 | 紫色风格 |
| HttpUrl | 网络请求地址,默认http://127.0.0.1:6000 |
工作模式
地图样式
| 字段 | 描述 | 默认值 |
|---|---|---|
| AutoRun | 是否开机启动 | false |
| MoveEnable | 模块是否可以拖动,启用以后模块可以任意拖动 | true |
| CutLeftBottom | 底部布局左侧是否切掉 | true |
| CutRightBottom | 底部布局右侧是否切掉 | true |
| StaticLine | 是否绘制静态定位线,为假则绘制游标十字线 | false |
| ShowPercent | Y轴是否显示百分比 | false |
| StepY | Y轴大尺度步长 | 6 |
| CursorHideTime | 用户不操作鼠标自动隐藏鼠标的时间间隔,单位秒 | 5 |
| 字段 | 描述 | 默认值 |
|---|---|---|
| VideoFillImage | 视频缩放,拉伸填充整个窗体 | false |
| VideoCallback | 视频回调,开启后采用painter走GPU绘制视频 | false |
| VideoPlayAudio | 播放音频,开启后视频同步播放音频 | true |
| VideoPlayRepeat | 视频循环播放,开启后视频会循环播放 | false |
| VideoUrl | 视频流地址,视频模块播放的视频地址 | 变动的 |
| 字段 | 描述 | 默认值 |
|---|---|---|
| ColorMainBg | 主背景颜色 | QColor(4, 7, 38) |
| ColorPanelBg | 面板背景颜色 | QColor(26, 29, 60) |
| ColorLine | 十字线定位线颜色 | QColor(255, 0, 0) |
| ColorLine1 | 线条1颜色 | QColor(0, 176, 180) |
| ColorLine2 | 线条2颜色 | QColor(32, 159, 223) |
| ColorLine3 | 线条3颜色 | QColor(255, 192, 0) |
| 字段 | 描述 | 默认值 |
|---|---|---|
| ColorTitleBg | 标题栏背景颜色 | QColor(48, 48, 85) |
| ColorTitleText | 标题栏文字颜色 | QColor(255, 255, 255) |
| ColorChartBg | 曲线图表背景颜色 | QColor(38, 41, 74) |
| ColorChartText | 曲线图表文字颜色 | QColor(250, 250, 250) |
| ColorChartGrid | 曲线图表网格颜色 | QColor(180, 180, 180) |
| 字段 | 描述 | 默认值 |
|---|---|---|
| ColorOk | 正常颜色 | QColor(0, 176, 180) |
| ColorLow | 警戒颜色 | QColor(255, 192, 0) |
| ColorAlarm | 报警颜色 | QColor(214, 77, 84) |
| ColorDisable | 禁用背景颜色 | QColor(210, 210, 210) |
| ColorPercent | 环形百分比背景颜色 | QColor(0, 254, 254) |
| 字段 | 描述 | 默认值 |
|---|---|---|
| MainFont | 全局字号 | 微软雅黑,12 |
| NameFont | 软件名称字号 | 19 |
| LabFont | 加粗标签字号 | 12 |
| DeviceFont | 设备面板字号 | 12 |
| SubTitleFont | 模块子标题栏字号 | 13 |
| TitleFont | 模块标题栏字号 | 15 |
| 字段 | 描述 | 默认值 |
|---|---|---|
| TitleHeight | 模块标题栏高度 | 23 |
| HeadHeight | 表格表头高度 | 28 |
| RowHeight | 表格行高度 | 25 |
| LayoutSpacing | 布局空隙间隔 | 6 |
| SwitchBtnWidth | 开关按钮宽度 | 65 |
| SwitchBtnHeight | 开关按钮高度 | 26 |
| ScrollWidth | 滚动条宽度 | 15 |
| 字段 | 描述 | 默认值 |
|---|---|---|
| IntervalModule1 | 模块1采集间隔,单位毫秒 | 5000 |
| IntervalModule2 | 模块2采集间隔,单位毫秒 | 5100 |
| IntervalModule3 | 模块3采集间隔,单位毫秒 | 5200 |
| IntervalModule4 | 模块4采集间隔,单位毫秒 | 5300 |
| IntervalModule5 | 模块5采集间隔,单位毫秒 | 5400 |
| IntervalModule6 | 模块6采集间隔,单位毫秒 | 5500 |
| IntervalModule7 | 模块7采集间隔,单位毫秒 | 5600 |
| IntervalModule8 | 模块8采集间隔,单位毫秒 | 5700 |
| 字段 | 描述 | 默认值 |
|---|---|---|
| LocalDBType | 本地数据库类型,Sqlite、Mysql等 | Sqlite |
| LocalDBIP | 本地数据库主机地址 | 127.0.0.1 |
| LocalDBPort | 本地数据库端口 | 3306 |
| LocalDBName | 本地数据库名称 | bigscreen |
| LocalUserName | 本地数据库用户名 | root |
| LocalUserPwd | 本地数据库密码,以密文存储 | root |

整个大屏系统就是由一个个子模块组成,每个子模块都用到了一些自定义控件,再打通数据库采集和网络请求采集等,将采集到的数据设置到对应的模块界面上。
| 主模块 | 说明 |
|---|---|
| 3rd | 一些第三方开源的类库,比如图表qcustomplot。 |
| class | 存放系统初始化、样式控制、自定义控件等。 |
| core | 本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。 |
| ui | 所有的界面都分门别类放在这里。 |
| 主模块 | 子模块 | 说明 |
|---|---|---|
| 3rd | 3rd_qcustomplot | 大名鼎鼎的第三方开源的图表组件。 |
| class | api | 存放数据库表映射成对应的全局队列数据、通用的辅助函数类。 |
| class | app | 全局配置参数管理类、秘钥管理类、通用函数。 |
| class | usercontrol | 当前系统的自定义控件全部放在这里,其中包括自定义饼图控件、进度仪表盘、百分比仪表盘、环形进度条、三态进度条等控件。 |
| core | core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里。 |
| core | core_customplot | 继承自qcustomplot类的自定义图表组件,专为大屏系统定制的各种图表组件。 |
| core | core_db | 数据库集成应用组件,比如数据库管理线程类、数据库清理线程类、数据库采集类、网络请求采集类等 |
| core | core_ffmpeg | 视频监控内核,采用ffmpeg解码,支持各种视频流和本地视频文件,支持声音播放和音视频同步。 |
| core | core_map | 地图内核,包括了百度echart封装类,区域轮廓数据转换js函数封装类,百度地图封装类等。 |
| core | core_opengl | 视频绘制类,采用opengl绘制,走GPU绘制。 |
| core | core_webview | 通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。 |
| ui | frmcontrol | 大屏控件演示示例,每个功能演示都是个独立的窗体,方便查看代码学习如何使用。 |
| ui | frmmain | 主界面模块,包括了系统配置界面、大屏主界面、大屏指定分辨率用于截图的主界面、设备面板窗体。 |
| ui | frmmodule | 大屏子模块,包括了产量汇总、当月计划、设备监控、模具进度、负荷分布、送检合格率、品质管理、物料管理、视频监控、大屏地图等。 |

将对应的用户表映射到变量队列存储,以便用户登录和整体判断权限等。
这个类就像万能胶一样,在本人写的所有的项目中都有,本类就是将平时常用的一些通用函数都丢在这里,不断完善和持续改进,包括了16进制数据转换、图形字体设置、自定义消息框、错误框、提示框等,集成设置窗体居中显示、设置翻译文件、设置编码、设置延时、设置系统时间等静态方法。
xxxxxxxxxx271123
+4567
+8class QUIHelper9{10public:11 //获取当前鼠标所在屏幕索引+尺寸12 static int getScreenIndex();13 static QRect getScreenRect(bool available = true);14
+15 //获取桌面宽度高度16 static int deskWidth();17 static int deskHeight();18 static QSize deskSize();19
+20 //居中显示窗体21 //定义标志位指定是以桌面为参照还是主程序界面为参照22 static QWidget *centerBaseForm;23 static void setFormInCenter(QWidget *form);24 static void showForm(QWidget *form);25
+26 //程序文件名称及所在路径27 static QString appName();28 static QString appPath();29
+30 //获取编译器字符串31 static QString getCompilerString();32 //获取uuid33 static QString getUuid();34
+35 //新建目录36 static void newDir(const QString &dirName);37 //通用延时函数 支持Qt4 Qt5 Qt638 static void sleep(int msec);39
+40 //设置编码41 static void setCode(bool utf8 = true);42 //设置字体43 static QFont addFont(const QString &fontFile, const QString &fontName);44 static void setFont(const QString &fontFile = ":/font/DroidSansFallback.ttf",45 const QString &fontName = QUIConfig::FontName,46 int fontSize = QUIConfig::FontSize);47 //设置翻译文件48 static void setTranslator();49 static void setTranslator(const QString &qmFile);50
+51 //一次性设置所有包括编码字体翻译等52 static void initAll(bool utf8 = true);53 //初始化main函数最前面执行的一段代码54 static void initMain(bool on = true);55
+56 //16进制字符串转10进制57 static int strHexToDecimal(const QString &strHex);58 //10进制字符串转10进制59 static int strDecimalToDecimal(const QString &strDecimal);60 //2进制字符串转10进制61 static int strBinToDecimal(const QString &strBin);62
+63 //16进制字符串转2进制字符串64 static QString strHexToStrBin(const QString &strHex);65 //10进制转2进制字符串一个字节66 static QString decimalToStrBin1(int decimal);67 //10进制转2进制字符串两个字节68 static QString decimalToStrBin2(int decimal);69 //10进制转16进制字符串,补零.70 static QString decimalToStrHex(int decimal);71
+72 //int转字节数组73 static QByteArray intToByte(int data);74 static QByteArray intToByteRec(int data);75
+76 //字节数组转int77 static int byteToInt(const QByteArray &data);78 static int byteToIntRec(const QByteArray &data);79 static quint32 byteToUInt(const QByteArray &data);80 static quint32 byteToUIntRec(const QByteArray &data);81
+82 //ushort转字节数组83 static QByteArray ushortToByte(ushort data);84 static QByteArray ushortToByteRec(ushort data);85
+86 //字节数组转ushort87 static int byteToUShort(const QByteArray &data);88 static int byteToUShortRec(const QByteArray &data);89
+90 //字符串补全91 static QString getValue(quint8 value);92 //字符串去空格 -1=移除左侧空格 0=移除所有空格 1=移除右侧空格 2=移除首尾空格 3=首尾清除中间留一个空格93 static QString trimmed(const QString &text, int type);94
+95 //异或加密-只支持字符,如果是中文需要将其转换base64编码96 static QString getXorEncryptDecrypt(const QString &value, char key);97 //异或校验98 static uchar getOrCode(const QByteArray &data);99 //计算校验码100 static uchar getCheckCode(const QByteArray &data);101
+102 //CRC校验103 static QByteArray getCrcCode(const QByteArray &data);104
+105 //字节数组与Ascii字符串互转106 static QString byteArrayToAsciiStr(const QByteArray &data);107 static QByteArray asciiStrToByteArray(const QString &data);108
+109 //16进制字符串与字节数组互转110 static QByteArray hexStrToByteArray(const QString &data);111 static QString byteArrayToHexStr(const QByteArray &data);112
+113 //选择文件对话框114 static QString getOpenFileName(const QString &filter = QString(),115 const QString &dirName = QString(),116 const QString &fileName = QString(),117 bool native = false, int width = 900, int height = 600);118 //保存文件对话框119 static QString getSaveFileName(const QString &filter = QString(),120 const QString &dirName = QString(),121 const QString &fileName = QString(),122 bool native = false, int width = 900, int height = 600);123 //选择目录对话框124 static QString getExistingDirectory(const QString &dirName = QString(),125 bool native = false, int width = 900, int height = 600);126
+127 //获取文件名,含拓展名128 static QString getFileNameWithExtension(const QString &fileName);129 //获取选择文件夹中的文件130 static QStringList getFolderFileNames(const QStringList &filter);131
+132 //复制文件133 static bool copyFile(const QString &sourceFile, const QString &targetFile);134 //删除文件夹下所有文件135 static void deleteDirectory(const QString &path);136
+137 //从字符串获取IP地址138 static QString getIP(const QString &url);139 //判断是否是IP地址140 static bool isIP(const QString &ip);141 //判断是否是MAC地址142 static bool isMac(const QString &mac);143 //判断是否是合法的电话号码144 static bool isTel(const QString &tel);145 //判断是否是合法的邮箱地址146 static bool isEmail(const QString &email);147
+148 //IP地址字符串与整型转换149 static QString ipv4IntToString(quint32 ip);150 static quint32 ipv4StringToInt(const QString &ip);151
+152 //判断IP地址及端口是否在线153 static bool ipLive(const QString &ip, int port, int timeout = 1000);154 //下载网络文件155 static bool download(const QString &url, const QString &fileName, int timeout = 1000);156 //获取网页所有源代码157 static QByteArray getHtml(const QString &url, int timeout = 1000);158
+159 //获取本机公网IP地址160 static QString getNetIP(const QString &html);161 //获取本机IP162 static QString getLocalIP();163 //获取本机IP地址集合164 static QStringList getLocalIPs();165 //Url地址转为IP地址166 static QString urlToIP(const QString &url);167
+168 //设置边框阴影169 static void setFormShadow(QWidget *widget, QLayout *layout, const QString &color, int margin, int radius);170 //立即更新所有阴影边框颜色比如换肤的时候需要用到171 static void setFormShadow(const QString &color);172
+173 //设置无边框窗体174 static void setFramelessForm(QWidget *widgetMain,175 bool tool = false, bool top = false,176 bool menu = true, bool x11 = false);177 static void setFramelessForm(QWidget *widgetMain, QWidget *widgetTitle,178 QLabel *labIco, QPushButton *btnClose,179 bool tool = true, bool top = true,180 bool menu = false, bool x11 = true);181
+182 //通用弹出框183 static int showMessageBox(const QString &info, int type = 0, int timeout = 0, bool exec = false);184 //弹出消息框185 static void showMessageBoxInfo(const QString &info, int timeout = 0, bool exec = false);186 //弹出错误框187 static void showMessageBoxError(const QString &info, int timeout = 0, bool exec = false);188 //弹出询问框189 static int showMessageBoxQuestion(const QString &info);190
+191 //弹出右下角信息框192 static void showTipBox(const QString &title, const QString &tip, bool fullScreen = false,193 bool center = true, int timeout = 0);194 //隐藏右下角信息框195 static void hideTipBox();196
+197 //弹出输入框198 static QString showInputBox(const QString &title, int type = 0, int timeout = 0,199 const QString &placeholderText = QString(), bool pwd = false,200 const QString &defaultValue = QString());201 //弹出日期选择框202 static int showDateSelect(QString &dateStart, QString &dateEnd, const QString &format = "yyyy-MM-dd");203
+204 //弹出关于对话框205 static void showAboutInfo(const AboutInfo &info, int timeout = 0, bool exec = false);206 //弹出中间提示框207 static void showSplashInfo(const QString &info, int fontSizeMain, int fontSizeSub, int timeout = 0, bool exec = false);208 //隐藏中间提示框209 static void hideSplashInfo();210
+211 //获取等比例缩放过的图片212 static QPixmap getPixmap(QWidget *widget, const QPixmap &pixmap, bool scale = false);213 static void setPixmap(QLabel *label, const QString &file, bool scale = false);214 //设置logo图片支持 资源文件+本地图片+图形字体+svg自动变色 等多种形式215 static void setLogo(QLabel *label, const QString &file,216 int width, int height, int offset = 20,217 const QString &oldColor = QString(), const QString &newColor = QString());218
+219 //初始化数据库220 static void initDb(const QString &dbName);221 //初始化文件,不存在则拷贝222 static void initFile(const QString &sourceName, const QString &targetName);223 //检查ini配置文件224 static bool checkIniFile(const QString &iniFile);225
+226 //设置图标到按钮227 static void setIconBtn(QAbstractButton *btn, const QString &png, int icon);228
+229 //写入消息到额外的的消息日志文件230 static void writeInfo(const QString &info, bool needWrite = false, const QString &filePath = "log");231 static void writeError(const QString &info, bool needWrite = false, const QString &filePath = "log");232
+233 //设置系统时间234 static void setSystemDateTime(const QString &year, const QString &month, const QString &day,235 const QString &hour, const QString &min, const QString &sec);236 //设置开机自启动237 static void runWithSystem(const QString &name, const QString &path, bool autoRun = true);238
+239 //获取内置颜色集合240 static QList<QColor> getColorList();241 static QStringList getColorNames();242 //随机获取颜色集合中的颜色243 static QColor getRandColor();244
+245 //初始化随机数种子246 static void initRand();247 //获取随机小数248 static float getRandFloat(float min, float max);249 //获取随机数,指定最小值和最大值250 static double getRandValue(int min, int max, bool contansMin = false, bool contansMax = false);251 //获取范围值随机经纬度集合252 static QStringList getRandPoint(int count, float mainLng, float mainLat, float dotLng, float dotLat);253
+254 //初始化表格255 static void initTableView(QTableView *tableView, int rowHeight = 25,256 bool headVisible = false, bool edit = false,257 bool stretchLast = true);258 //打开文件带提示框259 static void openFile(const QString &fileName, const QString &msg);260 //导出和打印数据提示框261 static bool checkRowCount(int rowCount, int maxCount, int warnCount);262
+263 //插入消息264 static QString appendMsg(QTextEdit *textEdit, int type, const QString &data,265 int maxCount, int ¤tCount,266 bool clear = false, bool pause = false);267 //首尾截断字符串显示268 static QString cutString(const QString &text, int len, int left, int right, const QString &mid = "...");269};270
+271// QUIHELPER_H 
| 名称 | 说明 |
|---|---|
| appconfig | 配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。 |
| appfun | 辅助函数类,比如重启,获取随机数、从多个数组中取出最大值等。 |
| appinit | 程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。 |
| appkey | 通用秘钥管理类。 |

| 名称 | 说明 |
|---|---|
| customchart | 自定义图表控件 |
| custompie | 自定义饼状图,纯painter绘制,弥补qchart组件不支持qt4等版本。 |
| customtitlebar | 自定义模块标题栏 |
| gaugepercent | 百分比仪表盘 |
| gaugespeed | 速度仪表盘 |
| progressring | 环形进度条 |
| progressthree | 三态进度条 |
| switchbutton | 开关按钮 |
+
+
+
+
+
+
+
| 名称 | 说明 |
|---|---|
| bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
| colorcombobox | 颜色下拉框控件,在系统设置中有。 |
| cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
| customtitlebar | 停靠窗体自定义标题栏控件。 |
| devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应视频预览等。 |
| framelesswidget | 无边框窗体管理类,无边框拖动+拉伸,主界面就用到了这个类。 |
| lcddatetime | 软件右上角显示时间的控件。 |
| panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
| switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
| xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |

| 名称 | 说明 |
|---|---|
| customplot | 自定义图表组件类。 |
| customplotbarh | 自定义形状-横向柱状图。 |
| customplotbarv | 自定义形状-垂直柱状图。 |
| customplothead | 当前组件通用头文件。 |
| customplothelper | 当前组件通用辅助函数文件。 |
| customplotline | 自定义形状-平滑曲线图。 |
| customplottracer | 自定义图层绘制十字线,也叫游标,定位线。 |
| smoothcurve | 平滑曲线算法类,内置多种平滑算法,可以自行增加其他算法。 |

本系统只用到了该类库中的dbconnthread、dbhttpthread。 +dbconnthread:封装的一个通用的数据库通信类,支持sqlite、mysql、PostgreSQL等数据库,功能包括了数据库的打开和关闭,线程执行sql语句队列信号发出执行结果等,支持重连。 +dbhttpthread:本系统除了支持数据库采集模式以外,还支持发送http网络请求的方式来采集数据,请求中带对应要查询的表,字段等信息,这个类就是专门的请求类,请求结果自动过滤运算并信号发出去,返回数据的信号和数据库采集的信号完全一致,使得主界面关联到同一个槽函数就能正常工作。
| 名称 | 说明 |
|---|---|
| dbcleanthread | 自动清理数据线程类。 |
| dbconnthread | 数据库通信管理线程类。 |
| dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
| dbhead | 当前组件通用头文件。 |
| dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
| dbhttpthread | 网络请求数据采集类。 |
| dbpage | 数据库通用翻页类。 |
| dbpagemodel | 数据库翻页类数据模型。 |
| navpage | 分页导航控件。 |

| 名称 | 说明 |
|---|---|
| ffmpegconvert | ffmpeg各种转换处理函数封装。 |
| ffmpeghead | ffmpeg引入头文件。 |
| ffmpeghelper | ffmpeg辅助类,包括版本号,校验url地址、获取流索引等。 |
| ffmpegsync | ffmpeg音视频同步类,包括了同步以及发出当前播放进度信号。 |
| ffmpegthread | ffmpeg核心解码类,包括音视频的解码。 |
| ffmpegtool | ffmpeg工具类,用于执行ffmpeg的命令获取结果。 |
| ffmpegwidget | ffmpeg视频显示窗体类,依赖ffmpegthread。 |
| videoffmpeg | ffmpeg多通道管理类。 |

| 名称 | 说明 |
|---|---|
| echartjs | echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。 |
| echarts | echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。 |
| mapbaidu | 百度地图封装类,支持在线和离线两种模式。 |

| 名称 | 说明 |
|---|---|
| nv12glwidget | 继承自QGLWidget的NV12格式OPENGL绘制窗体。 |
| nv12openglwidget | 继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。 |
| yuvglwidget | 继承自QGLWidget的YUV格式OPENGL绘制窗体。 |
| yuvopenglwidget | 继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。 |

| 名称 | 说明 |
|---|---|
| webcore.pri | 通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。 |
| miniblink | miniblink封装处理类。 |
| webhelper | 经纬度转换、获取小数点经纬度值等常用处理函数。 |
| webjsdata | 通用的浏览器控件和Qt程序交互数据中转类。 |
| webview | 通用浏览器控件,支持webkit、webengine、miniblink。 |

| 名称 | 说明 |
|---|---|
| frmcontrol | 大屏控件演示主界面,负责加载所有控件演示子窗体。 |
| frmplotarea | 曲线面积图。 |
| frmplotbarh | 横向柱状图。 |
| frmplotbarhs | 横向分组图。 |
| frmplotbars | 柱状堆积图。 |
| frmplotbarv | 标准柱状图。 |
| frmplotbarvs | 柱状分组图。 |
| frmplotdata | 数据转曲线。 |
| frmplotnormal | 标准曲线图。 |
| frmplotsin | 模拟曲线图。 |
| frmplotsmooth | 平滑曲线图。 |

| 名称 | 说明 |
|---|---|
| frmmodule | 大屏子模块演示主界面,负责加载所有子模块界面。 |
| frmmodule1 | 年度产量汇总。 |
| frmmodule2 | 当月计划达成率。 |
| frmmodule3 | 设备监控。 |
| frmmodule4 | 模具进度。 |
| frmmodule5 | 负荷分布。 |
| frmmodule6 | 送检一次合格率。 |
| frmmodule7 | 品质管理。 |
| frmmodule8 | 物料管理。 |
| frmmodule9 | 备用模块。 |
| frmmodulecenter | 中心窗体。 |
| frmmodulemap | 大屏地图。 |
| frmmodulevideo | 视频监控。 |

| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置界面。 |
| frmconfigdb | 通用数据库设置界面。 |
| frmdevice | 设备面板界面。 |
| frmmain | 大屏主界面。 |
| mainwindow | 以特定分辨率设置的大屏主界面用于截图。 |











































人大金仓数据库-kingbase,其实就是postgresql数据库改的,配置文件都一样,所以可以用连接postgresql数据库的方式进行处理。


ODBC连接字符串格式如上图所示。








V20220625
V20220522
V20220508
V20220428
V20190712
V20190624
+ 
系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。

在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。


基本设置中有部分参数的切换会自动重启应用。
参数说明
工作模式

参数说明
其他说明
x1//数据库类型枚举2enum DbType {3 DbType_ODBC = 0, //odbc数据源4 DbType_Sqlite = 1, //sqlite数据库5 DbType_MySql = 2, //mysql数据库6 DbType_PostgreSQL = 3, //postgresql数据库7 DbType_SqlServer = 4, //sqlserver数据库8 DbType_Oracle = 5, //oracle数据库9 DbType_KingBase = 6, //人大金仓数据库10 DbType_Other = 255 //其他数据库11};12
+13//自动切换默认数据库端口14void DbHelper::getDbDefaultInfo(const QString &dbType, QString &hostPort,15 QString &userName, QString &userPwd)16{17 if (dbType == "MYSQL") {18 hostPort = "3306";19 userName = "root";20 userPwd = "root";21 } else if (dbType == "SQLSERVER") {22 hostPort = "1433";23 userName = "sa";24 userPwd = "123456";25 } else if (dbType == "POSTGRESQL") {26 hostPort = "5432";27 userName = "postgres";28 userPwd = "123456";29 } else if (dbType == "ORACLE") {30 hostPort = "1521";31 userName = "system";32 userPwd = "123456";33 } else if (dbType == "KINGBASE") {34 hostPort = "54321";35 userName = "SYSTEM";36 userPwd = "123456";37 }38} 
参数说明

参数说明

网络转发的功能,是用来将本地的采集的所有设备的数据,通过UDP协议转发到指定的IP和端口,对方只要开启网络接收即可查看到设备的实时运行数据。网络转发和网络接收不能同时开启,本地负责采集的软件开启网络转发,远程需要查看数据的电脑开启网络接收,转发的端口和接收的端口必须保持一致,支持多个IP,中间用英文的分号 ; 隔开。单击同步数据的按钮会将本地的端口+设备+节点信息传送到接收端,不需要手动设置。这样就保证了本地的信息和远程的信息完全一致。远程的IP必须保证可达,比如ping的通。
参数说明

当探测器发生报警后,如果开启了短信告警,会将报警信息以短信的形式发送到预先设定的接收者的手机号码上,短信内容格式为:位号: AT400001 控制器: 控制器A 探测器: 探测器A 触发值: 70.8 PPM 类型: 浓度上限报警 时间: 2019-01-05 12:12:12。需要本地发短信的硬件支持。
参数说明

当探测器发生报警后,如果开启了邮件转发告警,会将报警信息以邮件的形式发送到预先设定的接收者的邮箱中,邮件内容格式为:位号: AT400001 控制器: 控制器A 探测器: 探测器A 触发值: 70.8 PPM 类型: 浓度上限报警 时间: 2019-01-05 12:12:12。后期会将警情统计的报表数据以excel表格的形式发送到接收者邮箱。如果发现邮箱登录失败等,请先在邮箱后台设置开启smtp和pop3。
参数说明

用来设置本地电脑的系统时间,为什么需要这个设置,因为软件很可能在嵌入式linux上运行,需要手动设置时间。

参数说明

参数说明

本系统支持串口接入和网络接入两种方式,对应的端口需要提前设置,后期可能还会新增mqtt等方式,选择不同的协议类型即可。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个端口信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个控制器信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

字段说明
报警类型
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个探测器信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

在报警联动设置中,可以设置每个位号报警后,对应的继电器联动,支持探测器串口和新独立的串口(如果是和探测器并用的串口则不会重新打开串口,直接用原有的串口发数据联动,如果是新的串口则会重新打开串口),模块地址为继电器板子的地址,联动地址集合为需要联动报警的位,支持多个,多对多关系,一个探测器报警可以联动多个联动模块上的多个继电器地址,中间丨杠隔开。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个联动信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

参数说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个类型信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
+ 
假设设置了用户没有系统设置和删除记录的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。

在地图管理中,可以导入和删除地图。

位置调整中,可以拖动探测器到正确的位置,右侧单击地图切换可以看到对应的该地图对应的探测器,全部位置调整好之后,单击右下角保存按钮即可,会立即应用。

组态设计模块中提供的是简单的示例,演示如何加载自定义控件动态库、将控件拖曳到背景地图上,配置好对应控件的属性,可定义用户属性,可导出控件的配置信息到xml文件,并支持导入xml文件自动加载上次保存的控件配置信息。目前是一个简单的组态雏形,等后期架构好如何应用再重写整个模块。
本系统默认不包括里面控件的源码,提供动态库的形式使用,如果还想学习自定义控件大全的源码(目前共202个控件卖700元),需要额外单独购买。

可以自行选择通讯端口+设备名称进行数据的过滤,可查看所有的通信数据。不同收发数据不同颜色,还可以指定关键字过滤数据,每个收发数据都有对应的中文解释。能够很方便的对运行中的系统查看设备数据,规避是下位机还是上位机问题扯皮的事情。

设备监控界面主要包括4个模块,分别是数据监控、设备面板、地图监控、曲线监控,设备的实时数据可以同时反应到四个模块上面,相当于以4种不同的表现形式展现采集到的数据。
模式说明

本页面会是使用频率最高的页面,默认就是停留在本页面实时查看所有探测器的数据。左侧为警情信息栏,分别显示时间、位号、报警值。如果有探测器报警,则消息自动追加到最前面。 +表格依次显示序号、位号、控制器名称、控制器型号、探测器名称、探测器型号、气体种类、浓度值、气体符号。
面板说明




本页面以地图的形式显示所有探测器,右侧单击对应地图可以手动切换地图,当探测器报警后会自动切换到当前地图,探测器图标红色闪烁,探测器图标实时显示当前的浓度值。双击探测器按钮图标,会跳转到该探测器的详细信息界面,在该界面上后期可以按照实际用户需求定制回控操作。
在本页面可以查看某个探测器的实时曲线,第一步先选择通信端口,第二步选择控制器,第三步选择探测器,然后就可以在左侧看到实时曲线,颜色可以在系统设置中设置。单击打印按钮会将当前曲线以截图的形式打印出来。勾选暂停显示记录数据复选框会暂停显示当前的数据。


在本页面,可以指定日期范围查询报警记录,还可以查询单个的控制器或者探测器的报警记录。也可以手动输入探测器的位号进行查询,下拉选择探测器后会自动填入位号。还可以选择报警类型(浓度上限报警、浓度下限报警)查询对应的类型,也可以输入报警值进行精准查询。
如果数据超过一页,会自动分页处理,单击右侧的上一页、下一页、第一页、末一页进行翻页查看,所有查询的数据可以导出到excel表格,也可以直接打印。单击删除按钮会弹出时间范围选择框,选择该时间段后确定,会删除该时间段的所有记录。
双击对应的报警记录可以打开警情确认对话框,重新填写确认意见,鼠标右键弹出删除记录菜单,可以删除当前选中的记录,支持多选,例如按住Ctrl键选择多个记录。


+ 
在本页面,可以指定日期范围查询运行记录,还可以查询单个的控制器或者探测器的运行记录。也可以手动输入探测器的位号进行查询,下拉选择探测器后会自动填入位号。
如果数据超过一页,会自动分页处理,单击右侧的上一页、下一页、第一页、末一页进行翻页查看,所有查询的数据可以导出到excel表格,也可以直接打印。单击删除按钮会弹出时间范围选择框,选择该时间段后确定,会删除该时间段的所有记录。


+ 
所有的用户操作都会记录到系统数据库,包括清空报警记录、删除记录、清空报警信息等操作。可以在本界面选择时间段范围查询,也可以选择日志类型(用户操作、设备上报)进行查询。
如果数据超过一页,会自动分页处理,单击右侧的上一页、下一页、第一页、末一页进行翻页查看,所有查询的数据可以导出到excel表格,也可以直接打印。单击删除按钮会弹出时间范围选择框,选择该时间段后确定,会删除该时间段的所有记录。


+ 






| 地址 | 功能码 | 寄存器地址 | 寄存器个数 | CRC校验 |
|---|---|---|---|---|
| 01 | 03 | 00 00 | 00 04 | 44 09 |
| 地址 | 功能码 | 长度 | 数据位1 | 数据位2 | 数据位3 | 数据位4 | CRC校验 |
|---|---|---|---|---|---|---|---|
| 01 | 03 | 08 | 00 00 | 00 00 | 00 00 | 00 00 | 95 D7 |
| 设备型号 | 长度 | 说明 |
|---|---|---|
| FC1003-1 | 01 | |
| FC1003-8 | 08 | |
| FC1003-16 | 08 08 | 相当与两台FC1003-8,设备地址不同。 |
| FC1003显示板 | 40 | 长度根据所接设备数量不同需要调整,最大为64个。 |
| FC1003底板 | 04 | |
| FT2104P | 01 | |
| SAMS-4128 | 08 |
提示说明
示例数据1
示例数据2
示例数据3
| 发送 | 返回 | 说明 |
|---|---|---|
| 01 03 00 00 00 01 84 0A | 01 03 02 00 00 B8 44 | 读取设备状态 |
| 01 06 00 00 00 01 48 0A | 01 06 00 00 00 01 48 0A | 打开继电器1 |
| 01 06 00 00 00 03 C9 CB | 01 06 00 00 00 03 C9 CB | 打开继电器1、2 |
| 01 06 00 00 00 07 C8 08 | 01 06 00 00 00 07 C8 08 | 打开继电器1、2、3 |
| 01 06 00 00 00 06 09 C8 | 01 06 00 00 00 06 09 C8 | 关闭继电器1 |
| 01 06 00 00 00 04 88 09 | 01 06 00 00 00 04 88 09 | 关闭继电器1、2 |
| 01 06 00 00 00 00 89 CA | 01 06 00 00 00 00 89 CA | 关闭继电器1、2、3 |
+
+
+
+
+ 










本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如数据导入导出组件,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。
| 名称 | 说明 |
|---|---|
| 3rd | 一些第三方开源的类库,比如串口通信qextserialport。 |
| class | 存放系统初始化、样式控制、自定义控件、设备通信等。 |
| core | 本人一直持续更新完善的通用的类库,比如数据导入导出组件。 |
| ui | 所有的界面都分门别类放在这里。 |

这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。具体代码不做过多说明,网上会有很多介绍和使用说明。
| 名称 | 说明 |
|---|---|
| 3rd_qcustomplot | 第三方精美图表控件qcustomplot,Qt自带的qchart功能有限而且不支持大量数据。 |
| 3rd_qextserialport | 第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。 |
| 3rd_qtpropertybrowser | 第三方属性控件,指定控件自动读取对应的属性形成属性栏。 |
| 3rd_smtpclient | 第三方发送邮件组件,走底层socket协议发送邮件。 |

这里放的都是一些系统初始化、设备通信相关的类。
| 名称 | 说明 |
|---|---|
| api | 存放数据库表映射成对应的全局队列数据、数据库查询类,告警短信转发及告警邮件转发类。 |
| app | 全局配置参数管理类、全局变量类、全局事件转发器,通用函数等。 |
| device | 设备通信管理,比如设备采集处理、数据库采集、报警联动等。 |
| usercontrol | 当前系统的用到的自定义控件全部放在这里,项目通用的自定义控件放在core_control中。 |
| 名称 | 说明 |
|---|---|
| dbdata | 将数据库表映射到全局变量数据队列,比如将端口信息表portinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。 |
| dbquery | 所有的数据库查询插入更新等操作都在这里,比如查询探测器信息表、控制器信息表、插入日志记录等。 |
| sendserver | 通用的发送短信和邮件管理类,因为发送的内容是一致的所有统一一个类来管理,调用同一个函数就行。 |

| 名称 | 说明 |
|---|---|
| appconfig | 配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。 |
| appdata | 全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。 |
| appevent | 全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。 通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。 |
| appinit | 程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。 |
| appstyle | 全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。 |
| 名称 | 说明 |
|---|---|
| alarmlink | 报警联动处理类,探测器报警后,根据联动设置中设置的规则,将发送联动指令到总线上的设备。 |
| dbreceive | 数据库采集类,通过数据库采集的方式来读取设备的状态和值,系统默认是设备采集,通过485总线modbus协议等去轮询设备的状态,为了拓展兼容性,还有一种场景是用户自己有自己的采集和算法,然后将结果存储到了数据库表中,需要用UI界面将数据库中的值展现出来。 |
| deviceclient | 设备采集类,本系统的核心,所有的通信解析都在此类中,因为数据内容格式一致,所以串口和网络通信收发都放在一起,这样解析起来完全一致。 |
| devicedata | 获取采集发送指令类,为了应对不同的场景,针对不同的工作模式,会有发送不同的采集指令。 |
| devicehelper | 整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮等。 |
| devicemap | 设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。 |
| deviceserver | 设备通信服务类,对应上面的deviceclient类,这里面负责从数据库查询有多少个端口和设备,实例化对应的client,关联信号进行统一的处理,同时还包括定时器处理记录的存储,定时器处理报警等。 |
| udpreceive | 数据转发UDP接收端,接收到转发的数据以后解析并反映到界面上。 |
| udpsend | 数据转发UDP发送端,负责将采集到的数据转发出去。 |
| 名称 | 说明 |
|---|---|
| gaugecar | 汽车仪表盘,用来指示气体的值。 |
| gaugespeed | 速度仪表盘,用来指示气体的值。 |
| selectwidget | 描点跟随窗体控件,用在属性设计过程中拖曳控件,然后拉伸拖动。 |

这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。
| 名称 | 说明 |
|---|---|
| core_common | 通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。 |
| core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。 |
| core_customplot | 继承自qcustomplot类的自定义图表组件,同时兼容各种qcustomplot版本,这样就可以在任意的Qt版本使用图表控件。 |
| core_dataout | 数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。 |
| core_db | 数据库通用类库比如数据库线程管理、数据清理、数据采集等。 |
| core_form | 通用的窗体相关的组件,包括用户登录、用户退出、用户管理、权限管理、数据库管理,同时还包括封装的项目上直接用的导入导出、打印等。 |
| core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
| core_send | 多线程短信发送和邮件发送类,功能类似所有放在一起。 |

| 名称 | 说明 |
|---|---|
| base64helper | 图片及文字和base64编码之间转换的类。 |
| commonkey | 通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。 |
| commonnav | 通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。 |
| commonstyle | 通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。 |
| framelesswidget2 | 无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。 |
| playwav | 声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。 |
| savelog | 日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。 |
| saveruntime | 保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。 |

| 名称 | 说明 |
|---|---|
| bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
| colorcombobox | 颜色下拉框控件,在系统设置中有。 |
| cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
| customtitlebar | 停靠窗体自定义标题栏控件。 |
| devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。 |
| lcddatetime | 软件右上角显示时间的控件。 |
| panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
| switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
| xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |

| 名称 | 说明 |
|---|---|
| customplot | 自定义图表控件主类,使用的时候只要new这个类就行。 |
| customplotbarh | 自定义形状-横向柱状图。 |
| customplotbarv | 自定义形状-垂直柱状图。 |
| customplothead | 当前组件通用头文件。 |
| customplothelper | 当前组件通用辅助函数文件。 |
| customplotline | 自定义形状-平滑曲线图。 |
| customplottracer | 自定义图层绘制十字线,也叫游标,定位线。 |
| smoothcurve | 平滑曲线算法类,内置多种平滑算法,可以自行增加其他算法。 |

| 名称 | 说明 |
|---|---|
| datacreat | 通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。 |
| datacsv | 导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。 |
| datahead | 当前组件通用头文件。 |
| datahelper | 辅助类,比如校验规则函数,通用数据导出+打印函数。 |
| dataprint | 数据打印到pdf及纸张,支持多线程。 |
| dataxls | 数据导出到xls类,支持多线程导出。 |

| 名称 | 说明 |
|---|---|
| dbcleanthread | 自动清理数据线程类。 |
| dbconnthread | 数据库通信管理线程类。 |
| dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
| dbhead | 当前组件通用头文件。 |
| dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
| dbhttpthread | 网络请求数据采集类。 |
| dbpage | 数据库通用翻页类。 |
| dbpagemodel | 数据库翻页类数据模型。 |
| navpage | 分页导航控件。 |

| 名称 | 说明 |
|---|---|
| formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
| frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
| frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
| frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
| frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
| userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |

本组件涵盖的功能较多,所以采用了分层管理代码结构。
| 名称 | 说明 |
|---|---|
| iconhelper | 万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。 |
| quiconfig | 存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。 |
| quihead | 当前组件通用头文件。 |
| quistyle | 当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。 |
| 名称 | 说明 |
|---|---|
| quiabout | 关于系统对话框,可传入软件标题、版本、版权、网址等信息。 |
| quidateselect | 自定义日期范围选择对话框。 |
| quiinputbox | 自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。 |
| quimessagebox | 自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。 |
| quisplash | 自定义弹出提示信息,提示完自动消息关闭。 |
| quitipbox | 自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。 |
| quiwidget | 自定义无边框窗体,可设置标题,各种图标等。 |
| 名称 | 说明 |
|---|---|
| quihelper | 项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。 |
| quihelpercore | 获取当前桌面分辨率,设置编码、字体、翻译文件等。 |
| quihelperdata | 16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。 |
| quihelperfile | 选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。 |
| quihelperform | 设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。 |
| quihelperimage | 获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。 |
| quihelpernet | 获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。 |
| quihelperother | 初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。 |
| 名称 | 说明 |
|---|---|
| sendemailthread | 多线程发送邮件类,支持附件,可设置多个抄送。 |
| sendmsgthread | 多线程收发短信类,支持长短信发送和多个收件人。 |

界面说明
| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置模块,包括基本设置、端口管理、控制器管理、探测器管理、联动设置、类型管理等。 |
| frmconfig2 | 其他设置模块,包括地图管理、用户管理、组态设计、设备调试等。 |
| frmdata | 日志查询模块,包括用户日志、运行日志、报警日志等。 |
| frmmain | 主界面模块,包括软件主界面、模拟调试工具等。 |
| frmother | 其他模块,包括封装的设备信息面板,设备回控等。 |
| frmview | 视图模块,包括数据监控、设备面板、地图监控、曲线监控等。 |

| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如控制器管理、探测器管理等。 |
| frmconfigdbnet | 远程数据库设置,用于将本地数据实时同步到远程服务器。 |
| frmconfigdevice | 控制器管理,可以增加、删除、修改、清空、导入、导出、打印控制器信息。 |
| frmconfiglink | 联动管理,可以增加、删除、修改、清空、导入、导出、打印联动信息。具体联动规则依据厂家约定。 |
| frmconfignode | 探测器管理,可以增加、删除、修改、清空、导入、导出、打印探测器信息。本系统设备的最终节点,可以设置非常详细的各种参数。 |
| frmconfigport | 端口管理,可以增加、删除、修改、清空、导入、导出、打印端口信息。可以下拉选择对应的通信协议模式。 |
| frmconfigsystem | 系统设置,包括基本设置、数据库设置、网络转发配置、日志设置、颜色配置、短信告警设置、邮件转发设置等。 |
| frmconfigtype | 类型设置,为了增强灵活性拓展性,系统中的控制器类型、探测器类型、气体种类、气体符号等信息都可以在这里自定义。 |

| 名称 | 说明 |
|---|---|
| frmconfig2 | 其他设置模块主界面,采用堆栈窗体形式,加载多个子界面比如用户管理、位置调整等。 |
| frmconfigdebug | 数据打印调试,所有的设备数据通信都可以在这里看到,可以选择针对某个控制器和探测器,也可以选择只看发送还是接收的数据,所有的数据都有对应的解析文字,方便理解。 |
| frmconfigmap | 地图管理,可以添加删除地图图片文件。 |
| frmconfigposition | 位置调整,可以对地图上的设备拖动调整到合适的位置。 |
| frmconfigscada | 自定义控件属性设计器,演示如何加载自定义控件然后拖曳,导入导出xml文件,自定义用户数据,组态的雏形,目前功能单一。 |

| 名称 | 说明 |
|---|---|
| frmdata | 日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括用户日志、运行日志、报警日志等。 |
| frmdataalarm | 报警日志,可以按照日期范围、报警类型等查询日志,查询后的日志可打印和导出,还可以删除指定日期范围的日志以及清空所有日志。 |
| frmdatanode | 运行日志,可以按照日期范围、控制器等查询日志,查询后的日志可打印和导出,还可以删除指定日期范围的日志以及清空所有日志。 |
| frmdatauser | 用户日志,可以按照日期范围、操作类型等查询日志,查询后的日志可打印和导出,还可以删除指定日期范围的日志以及清空所有日志。 |

| 名称 | 说明 |
|---|---|
| frmmain | 系统主界面,采用堆栈窗体,加载各个子模块。 |
| frmtool | 模拟调试工具,可选择设备采集模拟或者数据库模拟。 |
| frmtimecpu | 时间和CPU内存模块,一般放在系统的右上角。 |
| 名称 | 说明 |
|---|---|
| frmdevicecontrol | 设备回控模块,目前就显示具体的探测器信息,后期按照用户需求定制。 |
| frmdevicenode | 设备面板模块,同时包含了多种面板样式比如普通样式、仪表样式,可以在系统设置中动态切换并立即应用,每个探测器在设备监控界面中都占用这样一个面板,显示具体的信息,包括实时更新值。 |

| 名称 | 说明 |
|---|---|
| frmview | 系统视图主界面,采用堆栈窗体,加载各个子模块。 |
| frmviewdata | 数据监控,表格形式展示每个设备的各项数据和单位,报警不同颜色显示,具体颜色可以在系统设置中设置。 |
| frmviewdevice | 设备监控,每个探测器都对应一个设备面板,超出则滚动条显示。 |
| frmviewmap | 地图监控,设备在图片地图上,报警后红色闪烁,可以双击弹出探测器的详细信息,同时在设备按钮上显示对应的采集到的值。 |
| frmviewplot | 曲线监控,可以指定某个探测器设备查看实时曲线,还可以看该设备的历史记录曲线。 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| PortID | 编号 | INTEGER | 主键自增 | |
| PortName | 端口名称 | VARCHAR | 30 | 不为空 |
| PortType | 协议类型 | VARCHAR | 15 | 不为空 |
| ComName | 串口号 | VARCHAR | 10 | |
| BaudRate | 波特率 | INTEGER | 6 | |
| TcpIP | 网络地址 | VARCHAR | 16 | |
| TcpPort | 网络端口 | INTEGER | 6 | |
| ReadInterval | 采集周期 | INTEGER | 4 | 不为空 |
| ReadTimeout | 通讯超时次数 | INTEGER | 4 | 不为空 |
| ReadMaxtime | 超时重连时间 | INTEGER | 4 | 不为空 |
| PortMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| DeviceID | 编号 | INTEGER | 主键自增 | |
| PortName | 端口名称 | VARCHAR | 30 | 不为空 |
| DeviceName | 控制器名称 | VARCHAR | 30 | 不为空 |
| DeviceAddr | 控制器地址 | INTEGER | 3 | 不为空 |
| DeviceType | 控制器类型 | VARCHAR | 20 | 不为空 |
| NodeNumber | 探测器数量 | INTEGER | 3 | 不为空 |
| DeviceMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| NodeID | 编号 | INTEGER | 主键自增 | |
| positionID | 位置编号 | VARCHAR | 20 | 不为空 |
| DeviceName | 控制器名称 | VARCHAR | 30 | 不为空 |
| NodeName | 探测器名称 | VARCHAR | 30 | 不为空 |
| NodeAddr | 探测器地址 | INTEGER | 3 | 不为空 |
| NodeType | 探测器类型 | VARCHAR | 20 | 不为空 |
| NodeClass | 气体种类 | VARCHAR | 20 | 不为空 |
| NodeSign | 单位符号 | VARCHAR | 20 | 不为空 |
| NodeUpper | 上限值 | VARCHAR | 10 | 不为空 |
| NodeLimit | 下限值 | VARCHAR | 10 | 不为空 |
| NodeMax | 最大值 | VARCHAR | 10 | 不为空 |
| NodeMin | 清零值 | VARCHAR | 10 | 不为空 |
| NodeRange | 缓冲值 | VARCHAR | 10 | 不为空 |
| NodeEnable | 启用禁用 | VARCHAR | 2 | 不为空 |
| NodeSound | 报警声音 | VARCHAR | 10 | 不为空 |
| NodeImage | 背景图片 | VARCHAR | 10 | 不为空 |
| SaveInterval | 存储周期 | INTEGER | 3 | 不为空 |
| DotCount | 小数点位数 | INTEGER | 1 | 不为空 |
| AlarmDelay | 报警延时 | INTEGER | 3 | 不为空 |
| AlarmType | 报警类型 | VARCHAR | 2 | 不为空 |
| NodeX | X坐标 | INTEGER | 4 | 不为空 |
| NodeY | Y坐标 | INTEGER | 4 | 不为空 |
| NodeMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| PositionID | 位置编号 | VARCHAR | 20 | 主键自增 |
| ComName | 串口名 | VARCHAR | 10 | 不为空 |
| BaudRate | 波特率 | INTEGER | 5 | 不为空 |
| ModelAddr | 模块地址 | INTEGER | 3 | 不为空 |
| LinkAddr | 联动地址集合 | VARCHAR | 20 | 不为空 |
| LinkEnable | 启用禁用 | VARCHAR | 2 | 不为空 |
| LinkMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| TypeID | 编号 | INTEGER | 主键自增 | |
| DeviceType | 控制器类型 | VARCHAR | 20 | |
| NodeNumber | 探测器数量 | INTEGER | 5 | |
| NodeType | 探测器类型 | VARCHAR | 20 | |
| NodeClass | 气体种类 | VARCHAR | 20 | |
| NodeSign | 气体符号 | VARCHAR | 20 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| PositionID | 位置编号 | VARCHAR | 20 | |
| NodeValue | 节点数据 | VARCHAR | 10 | 不为空 |
| NodeStatus | 节点状态 | INTEGER | 2 | 不为空 |
| SaveTime | 记录时间 | VARCHAR | 19 | 不为空 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| UserName | 用户名称 | VARCHAR | 20 | 不为空 |
| UserPwd | 用户密码 | VARCHAR | 10 | 不为空 |
| UserType | 用户类型 | VARCHAR | 10 | 不为空 |
| Permission1 | 用户权限1 | VARCHAR | 20 | |
| Permission2 | 用户权限2 | VARCHAR | 20 | |
| Permission3 | 用户权限3 | VARCHAR | 20 | |
| Permission4 | 用户权限4 | VARCHAR | 20 | |
| Permission5 | 用户权限5 | VARCHAR | 20 | |
| Permission6 | 用户权限6 | VARCHAR | 20 | |
| Permission7 | 用户权限7 | VARCHAR | 20 | |
| UserMark | 备注 | VARCHAR | 50 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| LogID | 编号 | INTEGER | 主键自增 | |
| TriggerTime | 触发时间 | VARCHAR | 19 | |
| UserName | 用户名称 | VARCHAR | 20 | |
| UserType | 用户类型 | VARCHAR | 10 | |
| LogType | 事件类型 | VARCHAR | 20 | |
| LogContent | 事件内容 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| LogID | 编号 | INTEGER | 主键自增 | |
| PositionID | 位置编号 | VARCHAR | 20 | |
| DeviceName | 控制器名称 | VARCHAR | 30 | |
| NodeName | 探测器名称 | VARCHAR | 30 | |
| NodeValue | 当前值 | VARCHAR | 10 | |
| NodeSign | 单位符号 | VARCHAR | 10 | |
| SaveTime | 保存时间 | VARCHAR | 19 | |
| LogMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| LogID | 编号 | INTEGER | 主键自增 | |
| PositionID | 位置编号 | VARCHAR | 20 | |
| DeviceName | 控制器名称 | VARCHAR | 30 | |
| NodeName | 探测器名称 | VARCHAR | 30 | |
| NodeValue | 当前值 | VARCHAR | 10 | |
| NodeSign | 单位符号 | VARCHAR | 10 | |
| Content | 报警内容 | VARCHAR | 20 | |
| StartTime | 开始时间 | VARCHAR | 19 | |
| EndTime | 结束时间 | VARCHAR | 19 | |
| ConfirmUser | 确认用户 | VARCHAR | 20 | |
| ConfirmTime | 确认时间 | VARCHAR | 19 | |
| ConfirmContent | 确认意见 | VARCHAR | 255 |
+
+ 
本系统专门配备了设备模拟工具,用来在没有外接真实设备的时候,模拟modbus协议数据,支持多个设备,支持串口和网络方式,可切换正常数据和报警数据,反应到主程序上。对应主程序中两种端口,一种是串口端口(这个可以用虚拟串口工具 Virtual Serial Port 虚拟一对串口用于测试),一种是网络端口(注意选择的监听主机地址和端口)。数据库模拟对应程序中的数据库采集运行模式,可以勾选自动模拟复选框。随机生成状态字段数据。

作为国际知名的modbus模拟仿真工具Modbus Slave,本系统也提供了对应的数据配置文件iotsystem.mbs,在db目录下,对应添加FC-1003-8控制器。两边的通信方式必须一致,比如软件上设置的串口则两边都是串口。具体Modbus Slave工具详细使用可以自行搜索,比如这篇文章 https://blog.csdn.net/xuw_xy/article/details/81166305 。
+
+ 
本系统支持邮件转发,前提是对应的邮箱账号需要开通 POP3/SMTP 等服务,按照图示开启即可,一般开启后会设置独立的管理密码,记得在系统设置那边的邮件转发,填写密码的时候要填的是独立管理密码,而不是邮箱号的密码,这个机制和任何第三方邮箱管理软件都一样。

本系统支持串口短信发送,需要发短信的硬件支持(俗称DXM),采用通用的标准的AT指令短信发送协议,支持任意厂家的串口短信设备。当设备报警后会自动组建报警短信发送给设定的收件人。支持中文短信发送和长短信发送,可以自行网上GM对应的硬件。

本系统除去第三方库(串口通信3rd_qextserialport、曲线图表3rd_qcustomplot、属性控件3rd_qtpropertybrowser、邮件发送3rd_smtpclient)的代码,总代码行数约4W行,纯代码行数约3W行。
本系统支持多种数据库,包括sqlite、mysql、sqlserver、postgresql、oracle、kingbase等,直接在系统设置中的数据库配置中切换即可,切换完数据库以后记得初始化数据库,否则数据库不存在。






+ 
在系统设置中设置好网络转发参数后,可以在接收的地方开启网络数据接收,这样只需要接收数据解析反应到界面就行,相当于数据源不是硬件设备而是网络转发过来的数据,不需要直接接硬件设备。
网络转发端,单击同步数据会把本地的端口信息、控制器信息、探测器信息发到远端。网络转发模块也可以作为无限级联使用,比如接收端还可以开启转发,继续转发给需要的地方,一个客户端上设置的转发也支持多个,用英文分号 ; 隔开,一对多关系,采用的无连接udp协议,几乎不占用系统资源。
+
+ 
云端数据库同步,相当于把本地采集到的数据实时存储到云端,至于这些记录到了云端后什么用途,一般会用来做web请求访问,或者app请求获取数据,具体应用看用户需求。
云端数据库也会存储到NodeData表中,意味着任意地方的客户端,都可以选择数据库采集模式,直接连接云端的数据库作为数据源。相当于可以无限级联。
使用说明
写法举例

万能办法,用谷歌或者谷歌内核的浏览器,打开时光网http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。
V20220625
V20220612
V20220515
V20220413
V20220106
V20211220
V20211205
x1void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)2{3 static QStringList names;4 if (names.count() == 0) {5 names << "黑蓝色" << "软件黑" << "视频黑";6 names << "深黑色" << "深蓝色" << "深灰色";7 names << "扁平黑" << "扁平蓝" << "扁平灰";8 names << "浅黑色" << "浅蓝色" << "浅灰色";9 names << "普通黑" << "普通蓝" << "普通灰";10 names << "大蓝色" << "大紫色" << "大银色";11 }12
+13 //中文皮肤名称对应样式表文件14 static QStringList files;15 if (files.count() == 0) {16 files << ":/qss/blackblue.css" << ":/qss/blacksoft.css" << ":/qss/blackvideo.css";17 files << ":/qss/darkblack.css" << ":/qss/darkblue.css" << ":/qss/darkgray.css";18 files << ":/qss/flatblack.css" << ":/qss/flatblue.css" << ":/qss/flatgray.css";19 files << ":/qss/lightblack.css" << ":/qss/lightblue.css" << ":/qss/lightgray.css";20 files << ":/qss/normalblack.css" << ":/qss/normalblue.css" << ":/qss/normalgray.css";21 files << ":/qss/otherblue.css" << ":/qss/otherpurple.css" << ":/qss/othersilvery.css";22 }23
+24 styleNames = names;25 styleFiles = files;26}V20211111
V20211101
V20211005
V20210922
V20210705
V20210603
V20210425
V20210403
V20210322
V20210305
V20201212
V20201108
20200828
V20200730
V20200620
V20191105
+ 
系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。

在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。
+ 
主界面由顶部主菜单导航、左侧右侧停靠窗体(设备列表、窗口信息、图文警情、悬浮地图、云台控制、设备控制、预置巡航、视频轮询等)、中间视频监控主画面组成,其中左右两侧的停靠窗体可以拉伸宽度,上下停靠窗体之间也可以拉伸高度,每个停靠窗体都可以关闭和悬浮。自动保存布局文件,下次启动自动应用。
新增说明
+ 
左侧和右侧的面板,可以通过单击面板右上角的关闭按钮来隐藏,当隐藏一个面板以后,剩余的面板会自动填充布局,如果需要重新显示面板,则在标题栏鼠标右键就可以对小面板进行显示和隐藏,右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比,下次启动后自动应用。
特别说明

面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。

视频播放同时支持多种方式:

在视频监控主界面,通道鼠标右键,会弹出右键菜单,选择截图当前视频或者截图所有视频,截图默认保存在可执行文件所在目录下的snap目录。视频面板底部工具栏也有截图按钮触发这个动作。 +文件名格式:Ch1_2020-07-30-13-41-24.png。
+ 
有多种方法可以删除视频:

系统支持多画面切换,全屏切换等,包括1+4+6+8+9+13+16+25+36+64画面切换,如果还需要增加更多的画面比如81+100等,可以直接在源码中稍微修改即可。
64画面效果图
+ 

在主界面画面栏右下角,按下声音图标自动弹出声音调节面板,失去焦点自动隐藏,拉动声音滚动条来调节声音大小,还有静音图标,声音调节目前做的是一个界面效果,并没有功能,具体功能自己实现,vlc内核和mpv内核已经封装了声音控制的接口函数。

功能说明

通道交换功能很常用,一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分,比如6画面8画面的时候,左侧有一个画面占据很大的位置,一般这个用来显示重要性最高的实时视频,如果需要通道交换,则按住通道拖动到另外一个通道上面松开鼠标即可,会立即应用,瞬间切换,这里切记不要移出视频画面外,移出去表示删除。
本系统也封装了代码中动态控制切换和动态交换,具体代码在DeviceThreadUI类中,具体全局函数在AppEvent类中。
xxxxxxxxxx51//指定通道显示视频 id从0开始2void slot_loadVideo(int channel, int ipcID);3void slot_loadVideo(int channel, const QString &url);4//通道交换5void slot_changeVideo(int channel1, int channel2); 
如果需要控制云台移动,先要选择对应的通道,边缘会高亮,进行云台控制的前提是该摄像机要是支持云台的摄像机,很多人以为啥摄像机都可以移动,这是错误的,如果摄像机不支持云台,这个功能就别玩了,玩不起,经常遇到一些人说怎么云台不能用了,一检查尼玛原来摄像机根本没有云台。
本系统云台控制走的是onvif协议,没有使用私有协议,上百家厂家的摄像机,走私有协议会玩死人的,所以统一采用onvif通用协议,需要提前在系统设置中的摄像机管理,搜索摄像机,输入正确的onvif用户信息后一键获取到云台地址。

设备控制部分,目前可以获取和设置图片参数、手动校时、重启设备等,上面那一堆复选框对应功能需要用厂家sdk去实现,后期可能会增加一些onvif能够处理的功能。和云台控制操作一样,操作前也是需要选中某个通道,然后才是对选中的通道进行设备控制,比如图片参数中的明亮度、对比度、饱和度。

本系统默认支持海康摄像机的报警事件订阅,默认已经订阅,如果摄像机已经开启了报警事件的话,默认一般是关闭的,比如摄像机后面的开关量输入报警接口,需要web页面进去设置开启。报警订阅走的是onvif协议,默认测试过海康的摄像机,其余摄像机有些没有测试成功,后期会详细查下原因并改进,会持续更新完善。

本系统中将视频显示这块都封装成了一个控件,每个视频控件都有自己独立的悬浮条,悬浮条的位置可以自行修改两三行代码调整,默认悬浮条在顶部,自动拉伸填充显示,你也可以改成左侧右侧等位置显示,高度可调。悬浮条是一排按钮组成,具体按钮什么名称标识符和功能,可以自定义,控件的封装只是默认放了一排按钮,除了关闭按钮实现了功能外,其余都是信号的形式发出去的,具体操作由程序员本身根据不同的厂家来定义不同的功能。
视频控件已经将OSD标签封装好了,默认提供两路OSD设置,每个OSD都可以设置是否启用、位置、文字内容、文字颜色、图片、文字大小等,这些设置都提供了友好的接口设置。
在devicevideosmart.cpp文件中有设置示例,默认注释的,参数含义如下:
xxxxxxxxxx211widget->setOSD1Visible(true);2widget->setOSD1FontSize(20);3widget->setOSD1Text(QString("当前人数: %1").arg(10));4widget->setOSD1Color(QColor("#D64D54"));5widget->setOSD1Format(0);6widget->setOSD1Position(1);7 8enum OSDFormat {9 OSDFormat_Text = 0, //文本10 OSDFormat_Date = 1, //日期11 OSDFormat_Time = 2, //时间12 OSDFormat_DateTime = 3, //日期时间13 OSDFormat_Image = 4 //图片14};15
+16enum OSDPosition {17 OSDPosition_Left_Top = 0, //左上角18 OSDPosition_Left_Bottom = 1, //左下角19 OSDPosition_Right_Top = 2, //右上角20 OSDPosition_Right_Bottom = 3 //右下角21};视频回放中有多个子模块,分别是不同的含义:

本地回放模块主要用来回放存储在本地电脑上的视频,先从右侧选择要回放的通道,默认是所有通道,然后选择类型:存储视频还是报警视频,默认选择存储视频(目前也只有存储的视频,没有报警视频,报警视频的规则还没定好,一般都是买过去自己定义),然后选择要查询的开始时间和结束时间,单击查询按钮,会自动列出来,双击对应的视频文件名称就会播放,除了查询按钮,其余按钮均没有实现具体功能。


视频下载是将查询出来的视频文件,按照勾选了的文件保存到选择的目录中。

远程回放模块是用来通过sdk的形式回放远程NVR设备上的录像文件,这个暂未实现,本系统主要是为了兼容性和通用性,通过具体sdk形式调用的处理都没有做,破坏了移植性,到了其他平台就没法使用了,本系统sdk使用这块默认用的海康sdk作为示例。

设备播放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频,现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频,这样使用起来很方便,当然在拉取视频流的时候要传入用户信息,防止非法获取,现在越来越多的应用场景需要通过NVR来调取回放视频,传统的SDK的方式非常累厂家太多,而国标的形式太繁琐复杂,于是rtsp形式的最简单的方式应运而生,目前支持的厂家也越来越多,每个厂家格式的规则不一样,可以自行咨询厂家的规则,本程序默认实现了海康、大华和深广的规则。

选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。


将勾选的图片序列文件,导出到选择的目录。

图文混排,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。

视频上传功能主要用来将本地存储的视频文件(也可以是其他文件),通过网络传输(默认TCP)上传到其他地方比如服务器,服务器上要运行接收文件的程序,这样就相当于远程备份视频文件的功能,视频文件可以勾选需要上传哪一些。
本地只需要在视频监控系统客户端上切换到视频上传页面,然后选择要查询的日期范围,单击查询,会将视频文件查询出来显示在左边的表格中,可以勾选要上传的视频文件,右侧填写好服务器的IP和端口(默认6000),单击上传按钮,会多线程的形式上传文件。
远程需要放置文件传输工具,该工具完整源码如果购买了视频监控系统,可以赠送,该工具同时具备了发送端和接收端的功能,配套视频监控系统使用的是接收端,视频监控系统作为发送端,填好监听端口后,单击监听按钮,一旦有连接文件上传,会自动显示对应的接收进度,文件名称以上传的文件名为准。
默认文件传输过程采用了加密机制,意味着传输的数据是加密后的数据,接收到以后根据设置的秘钥进行解密重新生成文件,防止文件传输过程中被拦截,可自定义加密规则。
电子地图有多个子模块,分别不同的功能,在每个模块上,双击对应的摄像机,都可以弹出实时视频预览画面,支持多个画面同时打开,每个摄像机都一个画面窗体。



功能和在线地图完全一致,唯一区别就是地图是离线的,不需要联网。离线的地图需要自己准备好,可以网上通过瓦片地图下载器来下载需要的地方的离线地图,一般离线地图比较大,他是一张张图片,所以建议离线地图只下载自己需要的即可,比如某个县的地图,而不是所有的,所有的起码有几十GB。
使用说明

在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。
在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。
功能特点

基本步骤

本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。

单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。

单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。


单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。
单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。

设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。


基本设置中有部分参数的切换会自动重启应用。
参数说明

参数说明

参数说明
其他说明
xxxxxxxxxx381//数据库类型枚举2enum DbType {3 DbType_ODBC = 0, //odbc数据源4 DbType_Sqlite = 1, //sqlite数据库5 DbType_MySql = 2, //mysql数据库6 DbType_PostgreSQL = 3, //postgresql数据库7 DbType_SqlServer = 4, //sqlserver数据库8 DbType_Oracle = 5, //oracle数据库9 DbType_KingBase = 6, //人大金仓数据库10 DbType_Other = 255 //其他数据库11};12
+13//自动切换默认数据库端口14void DbHelper::getDbDefaultInfo(const QString &dbType, QString &hostPort,15 QString &userName, QString &userPwd)16{17 if (dbType == "MYSQL") {18 hostPort = "3306";19 userName = "root";20 userPwd = "root";21 } else if (dbType == "SQLSERVER") {22 hostPort = "1433";23 userName = "sa";24 userPwd = "123456";25 } else if (dbType == "POSTGRESQL") {26 hostPort = "5432";27 userName = "postgres";28 userPwd = "123456";29 } else if (dbType == "ORACLE") {30 hostPort = "1521";31 userName = "system";32 userPwd = "123456";33 } else if (dbType == "KINGBASE") {34 hostPort = "54321";35 userName = "SYSTEM";36 userPwd = "123456";37 }38} 
参数说明

参数说明

可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。

本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。
基本步骤
特别说明
参数说明

轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。
轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。
添加方式
如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

参数说明

轮询表信息可以通过已添加的摄像机信息表选中添加,也可以自定义规则批量生成视频流地址添加,这种应用场景非常多,比如现场是某一种品牌的摄像机,视频流格式固定,只需要设置好主码流子码流的视频流格式,便可批量生成。
参数说明

可添加、删除、修改、清空轮询分组名称,相当于轮询预案。

用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
+单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
+单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
+ 
假设设置了用户没有退出系统和电子地图的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。

其他设置里面的内容之前在基本设置中,现在重新开一个窗体,因为后面可能还有各种各样的设置,预留空间。

系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。

系统中可能用到多种网络通信,比如软件主动连接服务器,需要填写TCP地址和端口,也可能软件作为服务端,填写TCP或者UDP监听端口。
切换到视频监控主界面,左侧设备列表,双击摄像机,自动通道播放,双击录像机则整个录像机下面的摄像机全部加载。
云台控制的前提是摄像机是通过onvif搜索的形式添加的,不然没有云台地址没法进行云台控制,当然也必须要求摄像机带云台,不带云台的摄像机是不能进行云台控制的。 +先选中要进行云台控制的摄像机通道,边缘高亮,然后再单击右侧的云台控件,可以上下左右等移动,变倍和光圈没有用。
在系统设置中开启自动校时后,设备自动上线后会自动将本地时间同步到设备。
在系统设置中开启事件订阅后,一旦接收到设备的报警信息会显示到主界面左下角的信息栏,右下角弹出对应的报警信息。 +摄像机要响应事件订阅,具体详细设置说明参见说明书其他说明中的摄像机报警输入设置。

操作说明
本系统支持多种内核,方便不同的用户选择,适应不同的应用场景,默认提供的是ffmpeg内核和vlc内核,其他内核需要额外购买或者定制,支持定制内核。 +每个内核实现的功能不一定完全一致,可仔细查看后面的每个内核的功能特点说明。



不自带,需要额外购买此模块。

不自带,需要额外购买此模块。

下面没有列出功能介绍的是暂时没有实现的内核
本系统主界面采用QMainWindow停靠窗体模式设计,这样可以自定义各种各样的子模块停靠悬浮等,不同的工作模式可以对应不同的模块,甚至可以拓展成不同的用户权限对应不同的主界面模块。所有子模块都是new出来的,支持任意多个。
视频监控系统支持多种工作模式,不同的工作模式可以有不同的主界面、悬停模块、布局方案。互相不影响。悬停模块可以有透明度,更具科幻感。







设备列表通过读取录像机信息(生成父节点,相当于区域,录像机信息本身在整个系统中目前就一个作为设备列表的区域信息功能,用户可以自行拓展作为其他用途。)、摄像机信息,自动生成设备列表,每个摄像机都对应一个主码流和子码流,支持各种视频流、本地视频文件、USB摄像机等。

窗口信息负责显示一些打印信息,比如串口是否打开成功,摄像机是否异常,各种报警日志等,可以在系统设置中设置不同的文字颜色,窗口信息的信息条数自动计算应用,保证最大可能的适应高度。

图文警情模块负责以图文的形式显示对应的警情或者提示信息,有时间、内容、图片,双击对应图片可以放大查看具体图片,为了方便演示如何使用,在此模块增加了右键菜单,可以添加消息、删除消息、清空消息。

云台控制模块,可以对选中的通道的摄像机(ONVIF协议),进行云台控制,可以控制球机的上下左右等各个方位的移动,还可以调节变倍步长,至于变焦和光圈,目前onvif协议中没看到对应的协议支持,没有实现。
云台移动总共有3种策略:绝对移动、相对移动、连续移动,本系统都支持三种策略,默认采用的连续移动,这也是大部分应用场景需要的,按下对应的方位进行移动,松开立即停止移动,非常人性化。

设备控制模块,可以对选中的通道的摄像机(ONVIF协议),进行获取参数、设置参数、手动校时、重启设备、抓拍图片、模拟报警等操作,可以对摄像机的明亮度、对比度、饱和度进行设置。后期还可能不断增加新的功能。

预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位、添加预置位、调用预置位、删除预置位、调用起始位、设置起始位、开始巡航、停止巡航等。
获取预置位以后,会将获取到的预置位集合(一般有255个甚至更多)显示到列表中,前面是编号token,后面是预置位的别名name,别名可以是中文的,可以通过添加预置位的时候设置中文的名称。在每个预置位信息后面都有三个按钮:调用、添加、删除,直接单击即可执行相应的动作,拉伸子模块窗体对应名称列自动拉伸填充。
自动巡航目前采用的策略是通过勾选查询回来的预置位信息,勾选,然后定时器每隔一段时间调用一次对应的预置位来实现,每次正在执行哪个预置位会在列表中自动选中该预置位,后期如果有更好的处理方法会自动更新改进代码。
目前放在预置位中,后期可能会有改动。

悬浮地图子模块,使用的百度地图,支持在线和离线,用于显示对于设备的位置,支持鼠标直接拖动和缩放。具体和飞行轨迹模块类似。

专为无人机打造的模块,也可以作为机器人移动模块,通过传入一个经纬度值,实时更新设备的位置和绘制轨迹,模块已经内置了接口进行处理,支持不同设备不同的轨迹颜色(这个功能好)。
此模块留给用户自行填入内容。

数据调试模块,用于显示通信串口的数据,自定义不同颜色显示,可以勾选过滤某个串口进行数据查看,也可以选择所有数据,还可以勾选暂停显示复选框用来暂停打印显示信息。
此模块留给用户自行填入内容。
此模块留给用户自行填入内容。

网页浏览模块,用于传入一个网页地址,打开对应的网页进行浏览,可用于网页展示信息,支持多个,可以自行增加,代码中演示了一个。
+
+
+
+
+ 
本系统内置高达18套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。
xxxxxxxxxx261void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)2{3 static QStringList names;4 if (names.count() == 0) {5 names << "黑蓝色" << "软件黑" << "视频黑";6 names << "深黑色" << "深蓝色" << "深灰色";7 names << "扁平黑" << "扁平蓝" << "扁平灰";8 names << "浅黑色" << "浅蓝色" << "浅灰色";9 names << "普通黑" << "普通蓝" << "普通灰";10 names << "大蓝色" << "大紫色" << "大银色";11 }12
+13 //中文皮肤名称对应样式表文件14 static QStringList files;15 if (files.count() == 0) {16 files << ":/qss/blackblue.css" << ":/qss/blacksoft.css" << ":/qss/blackvideo.css";17 files << ":/qss/darkblack.css" << ":/qss/darkblue.css" << ":/qss/darkgray.css";18 files << ":/qss/flatblack.css" << ":/qss/flatblue.css" << ":/qss/flatgray.css";19 files << ":/qss/lightblack.css" << ":/qss/lightblue.css" << ":/qss/lightgray.css";20 files << ":/qss/normalblack.css" << ":/qss/normalblue.css" << ":/qss/normalgray.css";21 files << ":/qss/otherblue.css" << ":/qss/otherpurple.css" << ":/qss/othersilvery.css";22 }23
+24 styleNames = names;25 styleFiles = files;26} 









备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。

本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。
| 名称 | 说明 |
|---|---|
| 3rd | 一些第三方开源的类库,比如串口通信qextserialport。 |
| class | 存放系统初始化、样式控制、自定义控件、设备通信等。 |
| core | 本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。 |
| ui | 所有的界面都分门别类放在这里。 |

这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。
| 名称 | 说明 |
|---|---|
| 3rd_qextserialport | 第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。 |
具体代码不做过多说明。

这里放的都是一些系统初始化、设备通信相关的类。
| 名称 | 说明 |
|---|---|
| api | 存放数据库表映射成对应的全局队列数据、通用的辅助函数类。 |
| app | 全局配置参数管理类、秘钥管理类、通用函数。 |
| devicecustom | 用户自定义设备通信管理,比如机器人通信、无人机通信等。 |
| devicevideo | 视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。 |
| usercontrol | 当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。 |
| 名称 | 说明 |
|---|---|
| dbdata | 将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。 |
| dbquery | 所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。 |
| 名称 | 说明 |
|---|---|
| appconfig | 配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。 |
| appdata | 全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。 |
| appevent | 全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。 |
| appinit | 程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。 |
| appstyle | 全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。 |
| appurl | 视频监控系统中常用的默认的视频地址集合。 |
| 名称 | 说明 |
|---|---|
| devicerobot | 机器人串口通信管理类。 |
| devicerobot2 | 机器人串口通信管理类2,有串口数据转发功能。 |
| deviceuavsserver | 无人机后端服务类,当前为空,用户自己添加。 |
| deviceuavsvideo | 无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。 |
| 名称 | 说明 |
|---|---|
| devicehelper | 整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。 |
| devicemap | 设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。 |
| deviceonvif | 设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。 |
| devicethreadui | 演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。 |
| devicevideosmart | 人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。 |
| 名称 | 说明 |
|---|---|
| gaugecloud | 云台仪表盘控件。 |
| cityhelper | 省市县联动类,通过从json文件读取省市县信息。 |
| weather | 城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。 |
| widgetsound | 声音面板控件,主界面右下角单击弹出音量条。 |

这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。
视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、视频监控、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。
| 名称 | 说明 |
|---|---|
| core_common | 通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。 |
| core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。 |
| core_dataout | 数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。 |
| core_db | 数据库通用类库比如数据库线程管理、数据清理、数据采集等。 |
| core_ffmpeg | 视频监控内核ffmpeg版本,本系统默认采用的内核。 |
| core_vlc | 视频监控内核vlc版本,本系统自带该内核。 |
| core_mpv | 视频监控内核mpv版本,需要额外购买,不在视频监控系统中。 |
| core_haikang | 视频监控内核海康sdk版本,需要额外购买,不在视频监控系统中。 |
| core_map | 地图综合应用类库,百度地图(支持在线离线)和echart封装类等。 |
| core_onvif | onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。 |
| core_opengl | opengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核视频,直接走GPU绘制。 |
| core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
| core_tcpfile | 文件多线程收发类,支持多个并发。 |
| core_video | 通用的视频监控管理类,封装了通用的视频控件和多通道统一管理。 |
| core_webview | 通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。 |
| 名称 | 说明 |
|---|---|
| base64helper | 图片及文字和base64编码之间转换的类。 |
| commonkey | 通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。 |
| commonnav | 通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。 |
| commonstyle | 通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。 |
| framelesswidget2 | 无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。 |
| playwav | 声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。 |
| savelog | 日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。 |
| saveruntime | 保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。 |
| 名称 | 说明 |
|---|---|
| bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
| colorcombobox | 颜色下拉框控件,在系统设置中有。 |
| cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
| customtitlebar | 停靠窗体自定义标题栏控件。 |
| devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。 |
| lcddatetime | 软件右上角显示时间的控件。 |
| panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
| switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
| xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |
| 名称 | 说明 |
|---|---|
| datacreat | 通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。 |
| datacsv | 导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。 |
| datahead | 当前组件通用头文件。 |
| datahelper | 辅助类,比如校验规则函数,通用数据导出+打印函数。 |
| dataprint | 数据打印到pdf及纸张,支持多线程。 |
| dataxls | 数据导出到xls类,支持多线程导出。 |
| 名称 | 说明 |
|---|---|
| dbcleanthread | 自动清理数据线程类。 |
| dbconnthread | 数据库通信管理线程类。 |
| dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
| dbhead | 当前组件通用头文件。 |
| dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
| dbhttpthread | 网络请求数据采集类。 |
| dbpage | 数据库通用翻页类。 |
| dbpagemodel | 数据库翻页类数据模型。 |
| navpage | 分页导航控件。 |
| 名称 | 说明 |
|---|---|
| ffmpegconvert | 各种转换处理函数封装。 |
| ffmpeghead | 当前组件通用头文件。 |
| ffmpeghelper | 辅助类,包括版本号,校验url地址、获取流索引等。 |
| ffmpegsync | 音视频同步类,包括了同步以及发出当前播放进度信号。 |
| ffmpegthread | 核心解码类,主要代码都在这,包括音视频的解码。 |
| ffmpegtool | 工具类,用于执行ffmpeg的命令获取结果。 |
| ffmpegwidget | 视频显示窗体类,解码后到这里显示,依赖ffmpegthread。 |
| videoffmpeg | 多通道管理类。 |
| 名称 | 说明 |
|---|---|
| echartjs | echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。 |
| echarts | echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。 |
| mapbaidu | 百度地图封装类,支持在线和离线两种模式。 |
| 名称 | 说明 |
|---|---|
| onvifbase | 基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。 |
| onvifdevice | 设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。 |
| onvifevent | 事件订阅具体实现类,可设置请求超时时间等。 |
| onvifhead | 当前组件通用头文件。 |
| onvifhelper | 辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。 |
| onvifmedia | 获取媒体文件具体解析类。 |
| onvifother | 其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。 |
| onvifptz | 云台控制实现类,包括绝对移动、相对移动等。 |
| onvifquery | 数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。 |
| onvifrequest | 网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。 |
| onvifsearch | 设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。 |
| onvifservices | 服务类,用于获取媒体地址、云台地址等。 |
| onvifsnap | 图片抓拍实现类,包括获取抓图地址、抓拍图片等。 |
| 名称 | 说明 |
|---|---|
| openglhead | 当前组件通用头文件。 |
| nv12glwidget | 继承自QGLWidget的NV12格式OPENGL绘制窗体。 |
| nv12openglwidget | 继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。 |
| yuvglwidget | 继承自QGLWidget的YUV格式OPENGL绘制窗体。 |
| yuvopenglwidget | 继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。 |
| 名称 | 说明 |
|---|---|
| formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
| frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
| frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
| frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
| frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
| userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |
本组件涵盖的功能较多,所以采用了分层管理代码结构。
| 名称 | 说明 |
|---|---|
| iconhelper | 万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。 |
| quiconfig | 存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。 |
| quihead | 当前组件通用头文件。 |
| quistyle | 当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。 |
| 名称 | 说明 |
|---|---|
| quiabout | 关于系统对话框,可传入软件标题、版本、版权、网址等信息。 |
| quidateselect | 自定义日期范围选择对话框。 |
| quiinputbox | 自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。 |
| quimessagebox | 自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。 |
| quisplash | 自定义弹出提示信息,提示完自动消息关闭。 |
| quitipbox | 自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。 |
| quiwidget | 自定义无边框窗体,可设置标题,各种图标等。 |
| 名称 | 说明 |
|---|---|
| quihelper | 项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。 |
| quihelpercore | 获取当前桌面分辨率,设置编码、字体、翻译文件等。 |
| quihelperdata | 16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。 |
| quihelperfile | 选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。 |
| quihelperform | 设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。 |
| quihelperimage | 获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。 |
| quihelpernet | 获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。 |
| quihelperother | 初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。 |
| 名称 | 说明 |
|---|---|
| tcpfilehead | 当前组件通用头文件。 |
| tcpfilehelper | 辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。 |
| tcpreceivefileserver | 接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。 |
| tcpreceivefilethread | 接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。 |
| tcpsearchfileserver | 搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。 |
| tcpsendfilethread | 发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。 |
| 名称 | 说明 |
|---|---|
| commonvideomanage | 通用视频管理类,比如定时器排队打开视频、排队重连视频,可设置超时时间、打开间隔、重连间隔等。 |
| commonvideowidget | 通用视频控件类,视频监控系统支持多种内核,每种内核对应的视频控件接口一样,根据预定义关键字识别具体的视频控件类,搞个通用的视频控件类,就不用每个用到该控件的代码文件去挨个判断预定义变量生成对应的视频控件,很大减少重复冗余代码量。 |
| 名称 | 说明 |
|---|---|
| webcore.pri | 通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。 |
| miniblink | miniblink封装处理类。 |
| webhelper | 经纬度转换、获取小数点经纬度值等常用处理函数。 |
| webjsdata | 通用的浏览器控件和Qt程序交互数据中转类。 |
| webview | 通用浏览器控件,支持webkit、webengine、miniblink。 |

界面说明
| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。 |
| frmdata | 日志查询模块,包括本地日志、设备日志等。 |
| frmdemo | 演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。 |
| frmipc | 存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。 |
| frmmain | 主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。 |
| frmmap | 地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。 |
| frmmodule | 停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。 |
| frmrobot | 无人机模块,包括图像增强、飞行监控等模块。 |
| frmuavs | 无人机模块,包括图像增强、飞行监控等模块。 |
| frmvideo | 视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。 |
| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。 |
| frmconfigdb | 数据库设置,独立出来,很多系统通用。 |
| frmconfigipc | 摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。 |
| frmconfigipcsearch | onvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。 |
| frmconfignvr | 录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。 |
| frmconfigpoll | 轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。 |
| frmconfigpollplus | 将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。 |
| frmconfigsave | 录像计划,目前空的,等想好了怎么设计好在实现。 |
| frmconfigsystem | 系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。 |
| frmconfiguser | 用户管理,可以增加、删除、修改、清空、导入、导出、打印用户信息。每个用户可以勾选不同的模块权限。 |
| 名称 | 说明 |
|---|---|
| frmdata | 日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。 |
| frmdatadevice | 设备日志,通过私有协议从NVR取对应设备日志信息。 |
| frmdatauser | 本地地址,用户操作的日志信息,可查询和导出打印数据记录。 |
| 名称 | 说明 |
|---|---|
| frmdemo | 单独的功能演示示例主窗体,加载多个子界面比如视频控件等。 |
| frmdemoqui | 通用辅助示例,主要演示qui通用组件中封装的函数如何使用,比如各种消息框、提示框等。 |
| frmdemovideoimage | 视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。 |
| frmdemovideoplus | 视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。 |
| frmdemovideosave | 视频保存示例,演示如何对视频控件进行视频保存,可动态保存。 |
| frmdemovideowidget | 视频控件示例,演示视频控件如何使用。 |
| 名称 | 说明 |
|---|---|
| frmipccontrol | 设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。 |
| frmipcnavigate | 巡航管理模块,暂未实现,后期完善。 |
| frmipcreset | 预置位管理模块,暂未实现,后期完善。 |
| frmipcptz | 云台控制模块,可对选中的摄像机进行云台控制。 |
| 名称 | 说明 |
|---|---|
| frmlogin | 用户登录界面,三次错误关闭,下拉可选用户,内置超级密码。 |
| frmlogout | 用户退出界面,三次错误关闭,下拉可选用户,内置超级密码。 |
| frmmain | 系统主界面,采用堆栈窗体,加载各个子模块。 |
| frmmain1 | 备用模块1界面,根据参数设置决定是否启用。 |
| frmtimecpu | 右上角日期时间+CPU内存显示。 |
| frmwelcome | 右上角欢迎信息界面。 |
| 名称 | 说明 |
|---|---|
| frmmap | 地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。 |
| frmmapcore | 通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。 |
| frmmapdevice | 通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。 |
| frmmapimage | 图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。 |
| frmmaplocal | 离线地图界面,可更新经纬度值、模拟运动轨迹等。 |
| frmmapweb | 在线地图界面,可更新经纬度值、模拟运动轨迹等。 |
| frmmaproute | 路径规划界面,可查询路线得到路线的经纬度坐标集合。 |
| 名称 | 说明 |
|---|---|
| frmdevicegps | 设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。 |
| frmdevicetree | 设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。 |
| frmmodule | 主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。 |
| frmmsglist | 图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。 |
| frmmsglistitem | 图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。 |
| frmmsgtable | 窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。 |
| frmwebview | 网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。 |
| 名称 | 说明 |
|---|---|
| frmrobotdata | 仿真数据模块,启动机器人通信服务,接收数据解析显示。 |
| frmrobotdebug | 数据调试模块,可模拟发送轨迹数据测试解析类。 |
| frmrobotdebug2 | 新数据调试模块,打印多个串口数据,不同颜色显示。 |
| frmrobotemulate | 运动仿真模块,预留给用户实现,一般放个3D效果。 |
| frmrobotlog | 机器人实时数据模块,预留给用户实现。 |
| 名称 | 说明 |
|---|---|
| frmvideo | 视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。 |
| frmvideopanel | 视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。 |
| frmvideopaneltool | 视频监控底部工具栏,独立出来一个类专门管理。 |
| frmvideoplayimage | 图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。 |
| frmvideoplaylocal | 本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。 |
| frmvideoplaynvr | 设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。 |
| frmvideoplayweb | 远程回放模块,需要用厂家sdk去实现,从NVR回放录像。 |
| frmvideopreview | 视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。 |
| frmvideoupload | 视频上传,将本地存储的视频文件上传到服务器。 |
本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。

演示通用组件比如qui封装的类的使用。

演示加载图片文件夹,进行图片序列的播放。

演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。

演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。

演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。

新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。提示:海康旗下的萤石目前暂时不支持onvif协议。

大华摄像机,需要在用户管理中添加onvif用户,添加好以后建议重启摄像机应用。

工具的名字叫ONVIF Device Manager,可以自行搜索下载,此工具位国际官方工具,如果此工具搜索不到摄像机,则说明该摄像机不是真正的onvif摄像机,不是标准的摄像机,目前市面上的绝大部分网络摄像机都支持onvif。具体用法可以参考 https://www.cnblogs.com/lsdb/p/9157302.html

现在大部分厂家的NVR也逐渐支持onvif,并将每个通道都可以单独列出来。
+
+ 
操作说明
+ 
打开项目:QT VS TOOLS – Open Qt Project File 选择 video_system.pro,然后等待项目加载完毕。 +由于项目中用到了ffmpeg和vlc,引用了对应的lib库,所以在用vs+qt的开发环境中,很可能报错提示映像是不安全的错误,导致编译通不过,需要做个设置。
解决方法

如果在数据库设置中选择了mysql数据库,需要对mysql数据库做个设置,就是将编码设置成utf8,已设置可以跳过,不然很可能数据库无法正常使用。
32位的Qt程序,带对应32位的libmysql动态库,可以访问32/64位的mysql数据库,64位的也是一样可以访问32/64位的mysql数据库,只需要带上对应位数的动态库就行。查看mysql是32位还是64位命令 mysql.exe -V。
+ 

在加载USB摄像机的时候,需要填写对应USB设备的名称,可以通过命令行和设备管理器查看对应的名称,要英文的。
在需要加载多个USB摄像机的场景下,有时候会遇到同名的USB名称设备,此时需要打开注册表进行设备名称修改后,按照新修改后的设备名称填入即可。
+
+ 

整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
下面是linux系统编译ffmpeg步骤
windows系统采用mingw编译ffmpeg https://blog.csdn.net/yp18792574062/article/details/108962638
xxxxxxxxxx51int main(int argc, char *argv[])2{3 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);4 QApplication a(argc, argv);5}xxxxxxxxxx21[Platforms]2WindowsArguments = dpiawareness=0
+
+ 

本系统除了支持直连各种数据库比如mysql、postgresql、sqlserver、oracle数据库,也支持odbc数据源的形式连接以上各种数据库,在配置数据源的时候,记得区分32、64位,对应数据源后面带有32/64一起字样的说明该数据源可以同时支持32位和64位的程序访问,不带的要用对应位数的才能访问。数据库名称记得填写的是数据源对应的名称,而不是数据源连接的数据库名称,很多人会搞错。
