From 8511dc866c7c2889fe485d829f55251c47dbc70f Mon Sep 17 00:00:00 2001 From: feiyangqingyun Date: Sun, 14 Nov 2021 13:06:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- colorwidget/colorwidget.cpp | 30 +++++++++--------- colorwidget/colorwidget.h | 9 ++++++ docs/video_system/index.html | 6 ++-- docs/video_system/snap/9-6-1.jpg | Bin 15489 -> 19852 bytes flatui/flatui.h | 10 +++--- .../framelesscore/framelessdialog.h | 18 +++++++++++ .../framelesscore/framelessmainwindow.h | 18 +++++++++++ .../framelesscore/framelesswidget.h | 18 +++++++++++ maskwidget/maskwidget.h | 12 +++++-- ntpclient/ntpclient.h | 16 ++++++---- savelog/savelog.cpp | 2 +- screenwidget/screenwidget.h | 30 ++++++++++++------ 12 files changed, 126 insertions(+), 43 deletions(-) diff --git a/colorwidget/colorwidget.cpp b/colorwidget/colorwidget.cpp index 0de3fc4..2f50abb 100644 --- a/colorwidget/colorwidget.cpp +++ b/colorwidget/colorwidget.cpp @@ -144,22 +144,22 @@ void ColorWidget::showColorValue() int red, green, blue; QString strDecimalValue, strHex; - if (!pixmap.isNull()) { - QImage image = pixmap.toImage(); - if (!image.isNull()) { - if (image.valid(0, 0)) { - QColor color = image.pixel(0, 0); - red = color.red(); - green = color.green(); - blue = color.blue(); - QString strRed = tr("%1").arg(red & 0xFF, 2, 16, QChar('0')); - QString strGreen = tr("%1").arg(green & 0xFF, 2, 16, QChar('0')); - QString strBlue = tr("%1").arg(blue & 0xFF, 2, 16, QChar('0')); + if (pixmap.isNull()) { + return; + } - strDecimalValue = tr("%1, %2, %3").arg(red).arg(green).arg(blue); - strHex = tr("#%1%2%3").arg(strRed.toUpper()).arg(strGreen.toUpper()).arg(strBlue.toUpper()); - } - } + QImage image = pixmap.toImage(); + if (image.valid(0, 0)) { + QColor color = image.pixel(0, 0); + red = color.red(); + green = color.green(); + blue = color.blue(); + QString strRed = tr("%1").arg(red & 0xFF, 2, 16, QChar('0')); + QString strGreen = tr("%1").arg(green & 0xFF, 2, 16, QChar('0')); + QString strBlue = tr("%1").arg(blue & 0xFF, 2, 16, QChar('0')); + + strDecimalValue = tr("%1, %2, %3").arg(red).arg(green).arg(blue); + strHex = tr("#%1%2%3").arg(strRed.toUpper()).arg(strGreen.toUpper()).arg(strBlue.toUpper()); } //根据背景色自动计算合适的前景色 diff --git a/colorwidget/colorwidget.h b/colorwidget/colorwidget.h index 70bdb30..374dbc2 100644 --- a/colorwidget/colorwidget.h +++ b/colorwidget/colorwidget.h @@ -1,6 +1,15 @@ #ifndef COLORWIDGET_H #define COLORWIDGET_H +/** + * 屏幕拾色器 作者:feiyangqingyun(QQ:517216493) 2016-11-11 + * 1. 鼠标按下实时采集鼠标处的颜色。 + * 2. 实时显示颜色值。 + * 3. 支持16进制格式和rgb格式。 + * 4. 实时显示预览颜色。 + * 5. 根据背景色自动计算合适的前景色。 + */ + #include class QGridLayout; diff --git a/docs/video_system/index.html b/docs/video_system/index.html index 91cfdaf..2268cc9 100644 --- a/docs/video_system/index.html +++ b/docs/video_system/index.html @@ -674,11 +674,11 @@ header, .context-menu, .megamenu-content, footer{ Qt编写的视频监控系统开发及使用说明
-
  • 0 前言说明

    0.1 系统说明

    1. 本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。
    2. 主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放)等功能。
    3. 如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。
    4. 每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。
    5. 整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
    6. 本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,购买者可永久免费升级,一次购买终生售后。

    0.2 特别说明

    1. 程序本身是个客户端(直接从摄像机取rtsp视频流)并不是服务器程序。
    2. 摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
    3. 实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。
    4. 程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
    5. 系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。
    6. 本系统适用于安防行业,所有录制视频也是针对摄像机的视频流,包括摄像机自身的rtsp格式视频流,摄像机重新推流的rtmp或者http的视频流,凡是源头不是摄像机的视频流一概不存储或者存储不成功,因为可能编码格式不一样。比如中央卫视、大雄兔等视频流是不存储的,因为源头不是摄像机。任何监控厂家的视频监控系统都是只存储监控摄像机的视频,其他一概不存储甚至添加都没法添加到系统中因为过滤掉了。
    7. 系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,并非有封装的库。
    8. 同时集成了数据库,多线程,串口通信,网络通信,音视频解码,网页地图、界面美化、UI布局等众多知识点。
    9. 未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。

    0.3 相关站点

    1. 国内站点:https://gitee.com/feiyangqingyun
    2. 国际站点:https://github.com/feiyangqingyun
    3. 个人主页:https://blog.csdn.net/feiyangqingyun
    4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun
    5. 产品主页:https://blog.csdn.net/feiyangqingyun/article/details/97565652
    6. 在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/video_system.html
    7. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。

    0.4 功能特点

    0.4.1 软件模块

    1. 视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。
    2. 视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。
    3. 电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。
    4. 日志查询模块,包括本地日志、设备日志等。
    5. 系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、用户管理等。

    0.4.2 基础功能

    1. 支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。
    2. 支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。
    3. 支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。
    4. 支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。
    5. 支持onvif协议,包括设备搜索、云台控制、预置位、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。
    6. 支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。
    7. 数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。
    8. 本地USB摄像机支持设置分辨率、帧率等参数。
    9. 所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。
    10. 支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。
    11. 双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。
    12. 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
    13. 删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。
    14. 图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。
    15. 视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。
    16. 封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
    17. 双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。
    18. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
    19. 支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。
    20. 支持超时自动隐藏鼠标指针、自动全屏机制。
    21. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
    22. 支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
    23. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
    24. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
    25. 可设置软件中文名称、英文名称、LOGO图标等。
    26. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。

    0.4.3 特色功能

    1. 主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。
    2. 停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。
    3. 双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。
    4. 原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。
    5. 原创数据导入导出机制,跨平台不依赖任何组件,瞬间导出数据。
    6. 内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。
    7. 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。
    8. 精美换肤,高达17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
    9. 视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。
    10. 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。
    11. 录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
    12. 可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。
    13. 支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。
    14. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
    15. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。
    16. 支持xp、win7、win10、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
    17. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

    0.5 目录说明

    1. 本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。
    2. config目录放的是软件的配置文件、地图模块需要的图片资源等。
    3. db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。
    4. logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。
    5. map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。
    6. sound目录存放的本系统所用的声音文件。
    7. layout目录存放的不同工作模式不同界面对应的布局方案配置文件。

    0.6 编译说明

    0.6.1 特别提示

    1. 本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行
    2. windows上Qt5.6以上的版本需要msvc编译器的版本才有,其余系统都会有。
    3. 如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。
    4. 本人亲测4.7、4.8、5.5、5.6、5.7、5.9、5.12、5.13、5.14、5.15、6.1等。
    5. 2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。
    6. 部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。
    7. 源码如果在嵌入式linux arm上编译,默认取消了视频监控内核ffmpeg,如果已经交叉编译好了对应arm的ffmpeg库,可以在pro中注释掉这个限制。 +

    0 前言说明

    0.1 系统说明

    1. 本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。
    2. 主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放)等功能。
    3. 如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。
    4. 每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。
    5. 整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
    6. 本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,购买者可永久免费升级,一次购买终生售后。

    0.2 特别说明

    1. 程序本身是个客户端(直接从摄像机取rtsp视频流)并不是服务器程序。
    2. 摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
    3. 实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。
    4. 程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
    5. 系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。
    6. 本系统适用于安防行业,所有录制视频也是针对摄像机的视频流,包括摄像机自身的rtsp格式视频流,摄像机重新推流的rtmp或者http的视频流,凡是源头不是摄像机的视频流一概不存储或者存储不成功,因为可能编码格式不一样。比如中央卫视、大雄兔等视频流是不存储的,因为源头不是摄像机。任何监控厂家的视频监控系统都是只存储监控摄像机的视频,其他一概不存储甚至添加都没法添加到系统中因为过滤掉了。
    7. 系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,并非有封装的库。
    8. 同时集成了数据库,多线程,串口通信,网络通信,音视频解码,网页地图、界面美化、UI布局等众多知识点。
    9. 未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。

    0.3 相关站点

    1. 国内站点:https://gitee.com/feiyangqingyun
    2. 国际站点:https://github.com/feiyangqingyun
    3. 个人主页:https://blog.csdn.net/feiyangqingyun
    4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun
    5. 产品主页:https://blog.csdn.net/feiyangqingyun/article/details/97565652
    6. 在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/video_system.html
    7. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。

    0.4 功能特点

    0.4.1 软件模块

    1. 视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。
    2. 视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。
    3. 电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。
    4. 日志查询模块,包括本地日志、设备日志等。
    5. 系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、用户管理等。

    0.4.2 基础功能

    1. 支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。
    2. 支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。
    3. 支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。
    4. 支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。
    5. 支持onvif协议,包括设备搜索、云台控制、预置位、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。
    6. 支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。
    7. 数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。
    8. 本地USB摄像机支持设置分辨率、帧率等参数。
    9. 所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。
    10. 支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。
    11. 双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。
    12. 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
    13. 删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。
    14. 图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。
    15. 视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。
    16. 封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
    17. 双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。
    18. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
    19. 支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。
    20. 支持超时自动隐藏鼠标指针、自动全屏机制。
    21. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
    22. 支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
    23. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
    24. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
    25. 可设置软件中文名称、英文名称、LOGO图标等。
    26. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。

    0.4.3 特色功能

    1. 主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。
    2. 停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。
    3. 双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。
    4. 原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。
    5. 原创数据导入导出机制,跨平台不依赖任何组件,瞬间导出数据。
    6. 内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。
    7. 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。
    8. 精美换肤,高达17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
    9. 视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。
    10. 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。
    11. 录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
    12. 可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。
    13. 支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。
    14. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
    15. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。
    16. 支持xp、win7、win10、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
    17. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

    0.5 目录说明

    1. 本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。
    2. config目录放的是软件的配置文件、地图模块需要的图片资源等。
    3. db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。
    4. logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。
    5. map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。
    6. sound目录存放的本系统所用的声音文件。
    7. layout目录存放的不同工作模式不同界面对应的布局方案配置文件。

    0.6 编译说明

    0.6.1 特别提示

    1. 本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行
    2. windows上Qt5.6以上的版本需要msvc编译器的版本才有,其余系统都会有。
    3. 如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。
    4. 本人亲测4.7、4.8、5.5、5.6、5.7、5.9、5.12、5.13、5.14、5.15、6.1等。
    5. 2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。
    6. 部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。
    7. 源码如果在嵌入式linux arm上编译,默认取消了视频监控内核ffmpeg,如果已经交叉编译好了对应arm的ffmpeg库,可以在pro中注释掉这个限制。 contains(QT_ARCH, arm) { DEFINES -= videoffmpeg }
    8. Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。
    9. 推荐用64位的Qt搭配64位的ffmpeg,目前绝大部分系统都是64位的,能获得最大性能提升,本人亲自对比测试32位和64位,64位无论资源占用和操作响应等体验都更优。

    0.6.2 注意事项

    1. 可执行文件在源码同级目录的bin目录下。
    2. 编译完成后记得将源码下的file目录下(切记是file目录下而不是file目录)的所有文件复制到可执行文件同一目录。
    3. 如果开启了视频监控(默认开启),则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核(默认就是ffmpeg)的话,则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。
    4. 各个操作系统的ffmpeg和vlc编译好的动态库以及miniblink的动态库下载地址。 -https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA  提取码: ujm7。
    5. 如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。
    6. 如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg,在ffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。
    7. 如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。
    8. 图形字体对照表在doc目录下的IconFont.png、Font Awesome Cheatsheet.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。
    9. 如果发现地图打不开,请先确认file目录下的所有文件有没有拷贝过去。
    10. 如果是用vs+qt可能报错 error LNK2026,解决办法详细见文档中其他说明。
    11. 默认用户名admin 密码admin。
    12. 系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。
    13. 如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。

    0.6.3 离线地图

    1. 离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。
    2. 也可以直接下载网盘中已经下载好的上海市的离线地图。
    3. 下载地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取密码:01jf 文件名称:bin_map_tiles.zip

    使用说明

    1. 将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。
    2. tiles文件夹是街道图,tiles_hybrid文件夹是卫星图。
    3. 默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。
    4. 要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。

    0.7 视频格式

    0.7.1 USB摄像头

    1. 内核ffmpeg写法:video=USB2.0 PC CAMERA(具体要看设备名)。
    2. 内核vlc写法:dshow://:dshow-vdev=Default (或者填USB2.0 PC CAMERA)
    3. 带参数写法:2020-12-12以后增加USB摄像头直接url带分辨率帧率写法,默认分辨率640x480。

    写法举例

    1. video=USB2.0 PC CAMERA|1920x1080|30(表示1920*1080分辨率30帧)
    2. video=USB2.0 PC CAMERA|640x480(表示640*480分辨率)
    3. dshow://:dshow-vdev=USB2.0 PC CAMERA(表示打开视频设备USB2.0 PC CAMERA、其他参数全部默认)
    4. dshow://:dshow-vdev=USB2.0 PC CAMERA:dshow-adev=麦克风 (USB Audio Device):dshow-size=1920*1080:live-caching=300(表示打开视频设备USB2.0 PC CAMERA、打开音频设备麦克风 (USB Audio Device)、分辨率640x480、缓存时间300毫秒)

    0.7.2 网络地址

    1. 下面的地址有时候会失效,可以自行网上找找其他的地址,网络视频地址建议在晚上测试会更流畅。
    2. 大雄兔:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
    3. 大雄兔:http://r.ossrs.net/live/bbb.flv
    4. 海康萤石:https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8
    5. 在线摄像机:http://vts.simba-cn.com:280/gb28181/21100000001320000002.m3u8
    6. 摄像机格式:https://blog.csdn.net/qq_38880380/article/details/80652697

    0.7.3 中央卫视

    1. 中央卫视1:rtmp://58.200.131.2:1935/livetv/cctv1
    2. 中央卫视2:rtmp://58.200.131.2:1935/livetv/cctv2
    3. 中央卫视3:rtmp://58.200.131.2:1935/livetv/cctv3
    4. 中央卫视4:rtmp://58.200.131.2:1935/livetv/cctv4
    5. 中央卫视5:rtmp://58.200.131.2:1935/livetv/cctv5
    6. 中央卫视6:rtmp://58.200.131.2:1935/livetv/cctv6
    7. 中央卫视7:rtmp://58.200.131.2:1935/livetv/cctv7
    8. 中央卫视8:rtmp://58.200.131.2:1935/livetv/cctv8
    9. 中央卫视9:rtmp://58.200.131.2:1935/livetv/cctv9
    10. 中央卫视10:rtmp://58.200.131.2:1935/livetv/cctv10

    0.7.4 视频文件

    1. http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2. http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4
    3. http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4
    4. http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4

    0.7.5 网友提供

    1. rtmp://live.yihtc.com:10935/hls/stream_3
    2. rtmp://live.yihtc.com:10935/hls/stream_13
    3. rtmp://218.3.205.46/live/ggpd_sd
    4. rtmp://hls.hsrtv.cn/hls/hstv2
    5. rtmp://hls.hsrtv.cn/hls/hstv1
    6. rtmp://222.173.22.119:1935/live/jnyd_sd
    7. rtmp://222.173.22.119:1935/live/xwhd_hd
    8. rtmp://livetv.dhtv.cn:1935/live/peoples
    9. rtmp://livetv.dhtv.cn:1935/live/citylife
    10. rtmp://livetv.dhtv.cn:1935/live/financial
    11. rtmp://livetv.dhtv.cn:1935/live/news

    0.8 版本说明

    V20211101

    1. 修正开启轮询后关闭所有视频通道不弹出提示信息。
    2. 所有信息框增加阴影边框区分突出显示,并跟随系统换肤自动更新边框阴影。
    3. 修正视频轮询分隔符,将|改成;因为如果是竖杠遇到带有参数的url则会出错。
    4. 将设备图片统一存放到config/device目录,之前在config目录下,随着越来越多非常凌乱。
    5. 修复之前通过信号执行通道切换,对应文字显示反了的BUG(通道1交换到通道2,新的通道2应该显示之前通道1的文本)。
    6. 将鼠标按下两个通道交换的处理代码,复用信号槽切换通道的函数。
    7. 将视频监控布局切换部分单独提取类VideoBox,专门负责管理各种通道布局切换,复用代码并且方便后期拓展,这部分代码和具体的处理无关,一直以来就想要单独提取出来进行管理,后期可以方便的增加其他异形布局以及255通道布局等,很多项目都用到了这个切换逻辑。
    8. 修复Qt6中视频控件悬浮条无法显示的BUG,因为Qt6将void enterEvent(QEvent *);改成了void enterEvent(QEnterEvent *);也不打个招呼。这种改变编译也不会提示的。
    9. 数据库组件修正sqlserver数据库必须设置数据源的不足,改成了dsn字符串形式,不需要新建数据源也能直接通信。
    10. 数据库组件修正mysql数据库必须存在默认数据库mysql的不足,改成了不需要默认数据库也能正常通信。
    11. 数据库组件修正没有默认数据库也能在建立连接后新建数据库操作。
    12. 数据库脚本执行将DROP DATABASE IF EXIST改成了DROP DATABASE ,这样无论什么时候都能先删除原来的数据库然后再新建数据库CREATE DATABASE。有些数据库不支持IF EXIST。

     

    V20211005

    1. 修正ffmpeg内核,在播放地址不存在的情况下,打开容易卡主引起崩溃的BUG,在打开回调函数中增加对线程停止标志位的判断,一旦在打开的回调中识别到需要停止线程则立即返回结束。
    2. 增加临时信息中间弹出框提示信息,比如一次性关闭所有通道的时候,界面会卡主的期间提示。
    3. 增加忙碌鼠标图标切换显示,忙完以后自动恢复鼠标样式。
    4. 修正ffmpeg内核,开始时间记录可能出现问题的BUG,会导致部分特殊MP4文件打不开。
    5. 应用程序关闭,增加全局退出信号关联到视频通道管理类,先关闭所有视频通道再彻底退出应用程序。不这样处理的话,发现vlc内核在开启了视频存储的时候,会关不掉程序。
    6. 修复在没有声音播放的情况下主动调用停止播放造成崩溃的BUG。
    7. 修复在linux系统上QUIWidget弹出的无边框窗体带系统标题栏的BUG。
    8. 修复ffmpeg内核关闭视频后opengl窗体来不及隐藏的BUG。
    9. 修复重复立即刷新打开所有通道,前一次还没执行后一次又来了的BUG,改成了定时器处理,在立即执行前将上一次还没来得及执行的先停止。
    10. 增加about关于对话框窗体,显示版本号、版权所有、网址、电话等信息。
    11. 所有弹出窗体都跟随软件主窗体默认居中,这个特性非常棒。
    12. 所有皮肤增加右键菜单选中图标样式、右键菜单二级子菜单右侧小三角箭头图标样式,单选框、复选框、禁用状态图标全部更新,从图形字体绘制,极其统一舒服。
    13. 着重对日志类savelog增加了最大行数、最大文件大小等参数设置,可以设置按照行数或者大小来自动分割日志文件。
    14. 日志类增加了可过滤不同的消息类型,不同消息类型增加消息头。
    15. 经过大量对比测试发现,使用miniblink浏览器内核,容易卡,说不定什么时候就失效了,问题集中在32位,64位的目前没有发现这个现象,webengine暂时没有这个现象,但是加载打开摄像机的网页配置,还是miniblink更优秀。
    16. 中文标题栏支持换行,既可以副标题写在英文标题上,也可以同等大小字体写在中文标题上。

    V20210922

    1. 视频控件边框增加0像素选项,这样看起来没有边框,有些场景需要无缝拼接。
    2. 修复当采用NVR通道作为摄像机视频流显示的时候,ONVIF处理索引越界崩溃的情况,因为一台NVR同一个IP地址对应多个摄像机。
    3. 所有样式17套皮肤更新边框颜色。
    4. 系统信息增加对应的编译器名字、位数、版本等。
    5. 演示demo增加视频叠加演示功能,比如在主视频的左上角、右上角、左下角、右下角在增加一个视频缩略图显示。
    6. 新增天气预报模块,可设置城市、采集间隔、展示样式等。
    7. 增加了vlc内核下USB摄像头格式自动纠正,如果采用ffmpeg的格式video=USB2.0 PC CAMERA|1920x1080自动纠正。
    8. 纠正vlc内核下USB摄像头不自动拉伸的BUG。
    9. 修正vlc内核动态保存视频文件,文件命名不符合规范,重新按照设定的重命名。
    10. 修复vlc内核中USB摄像头会当做rtsp视频流的BUG。
    11. 天气预报模块新增城市显示,新增双击弹出天气预报设置,含打印信息。
    12. 系统信息,增加秘钥文件的内容,比如允许的设备数量、到期日期等。
    13. 修复配置文件一旦新增加节点,之前节点全部初始值运行的BUG,应该是存在的节点则读取节点值,不存在的节点以初始值运行。

    V20210705

    1. 改进窗体居中显示算法,可设置参照窗体,默认基于当前屏幕中心,可设置参照主窗体则基于参照窗体,在大分辨率屏幕效果非常好,不然主窗体很小,弹个窗找不到还在很远的地方,还以为没有弹呢。
    2. 将登陆窗体、登出窗体、用户管理等公用界面,做成了通用库core_form。
    3. 修复MAC系统上无边框窗体无法最小化的BUG。
    4. 增加超级管理员密码A具有所有权限的机制,避免管理员误将系统设置权限取消后无法再次进去系统设置的问题。
    5. 图片参数增加锐度,图片参数设置滑块调节松开立即设置。
    6. 修复当没有启用图片地图的时候对应界面隐藏的时候保存设备坐标位置报错BUG,因为没有启用的情况下没有设置对应的对象指针。

    V20210603

    1. 将onvif搜索的用户密码,设备播放界面的设备密码等配置参数全部改成了密文存储。
    2. 大量修改代码,全部支持Qt4-Qt6所有版本。
    3. 调整onvif代码执行机制,改成了异步执行。
    4. 云台协议增加了连续移动。
    5. 增加了预置位相关处理,包括获取预置位、调用预置位、添加预置位、删除预置位。
    6. 自动巡航按照预置位集合进行,采用定时器去调用预置位队列。
    7. 增加图文警情行数、窗口信息行数配置,0行表示自动处理。
    8. 做了大量的代码改进,比如onvif内核换成了QDom对象处理,之前是采用的QXmlQuery查询,由于XmlPatterns这个模块逐渐废弃了,而且在Qt6中不再有,所以彻底移除了XmlPatterns相关的代码,改用其他处理方式实现。
    9. 增加了预置位和自动巡航处理,其中包括获取预置位集合、调用预置位、添加预置位、删除预置位、设置起始位、调用起始位等。
    10. ONVIF内核几乎全部重写,将数据改成了结构体,比如设备信息、预置位信息、事件信息等,可以存储更多的数据,拓展也非常灵活。
    11. onvif处理部分增加了对非onvif设备的过滤,通过判断是否存在onvif地址。这样可以大大加快处理速度,打开视频的时候去实例化onvif通信,关闭视频的时候删除对应的onvif类,这样可以动态响应。
    12. 所有onvif指令改成了线程处理,处理完成一个立马处理下一个,排队处理。

    V20210425

    1. 配置文件密码改成密文存储。
    2. 增加了无敌的牛逼的万能的完美入微级自动分页导航控件。
    3. 日志记录表增加索引,速度提升100倍以上。
    4. 新增多个设备轨迹 不同颜色+传入经纬度 单独示例。
    5. 对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数,可动态传入对应值。
    6. 系统设置增加用户管理模块,可分别设置对应的权限。
    7. 万能权限管理算法,通过设置不同需要授权的模块名称,对应切换的按钮自动计算。
    8. 增加了appkey秘钥类,用于校验秘钥是否正确,运行时间等。

    V20210403

    1. 增加全局变量AppData::LastLiveTime,记住程序最后的活动时间-包括键盘+鼠标活动,用于两个判断,一个是超过多久没有操作全屏下隐藏鼠标光标,一个是超过多久没有操作如果没有全屏则自动全屏。
    2. 增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。
    3. 重命名为TimeHideCursor表示程序多久未操作自动隐藏光标,TimeAutoFull程序多久未操作自动全屏界面,下拉框选项值增加0,表示不启用此功能。
    4. 增加信息列表模块frmMsgList,用于图文列表显示信息,对应兄弟类frmMsgTable用于表格显示消息。
    5. 大改版,将中间部分全部改成了QMainWindow,子模块全部采用停靠窗体,可以悬浮半透明,自动记忆每个模块的最后的位置,启动后自动应用。
    6. 移除大改版后的所有不需要用的变量和配置参数,重新调整配置参数。
    7. 增加透明度参数用于停靠窗体独立出来后的透明度。
    8. 将摄像机控制部分比如云台+控制+预置位+巡航,单独分类到ipc模块,方便管理。
    9. 限定操作员不能移动停靠窗体等,需要管理员设计好。
    10. 修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。
    11. 修复自动登录用户计算不正确的BUG,要以最后登录的用户为准。

    V20210322

    1. USB摄像头增加参数帧率,第二个参数是分辨率,第三个参数为帧率,不设置则采用默认的帧率,video=USB2.0 PC CAMERA|1920x1080|25。
    2. 增加独立的demo模块,专门用于测试监控系统中用到的组件和控件,演示如何使用,比如视频图片界面演示从文件夹读取图片绘制到窗体,视频窗体演示系统的核心组件视频控件的设置参数如何使用等。
    3. 增加了对其他数据库的支持,比如posgres、oracle、odbc、kingbase等数据库,理论上只要支持odbc数据源方式的都支持。
    4. 增加IndexStart启动窗体索引配置参数,0-主程序 1-演示示例。

    V20210305

    1. 修复数据库有时候没加载到的BUG。
    2. 新增配置参数控制画面切换的菜单和快捷图标是否显示。
    3. ffmpeg内核增加了可动态保存机制,点击开始保存按钮启动保存,单击结束则生成视频文件,如此往复。
    4. 海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。
    5. 新增多屏幕的支持,自动在对应屏幕最大化全屏,对话框位置,右下角提示框等。
    6. 再次分类存放代码文件,分成core ui class三大类。
    7. 系统配置更改视频控件参数,统一一个函数设置,initCommonVideoWidget函数中做了过滤,必须关闭状态的视频控件设置才起作用。
    8. 设备播放模块增加大华NVR的远程回放地址,其他地址计算算法调整。
    9. 新增界面模块功能启用配置参数。
    10. 新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。

    V20201212

    1. 增加USB摄像机分辨率设置,直接url带掉。
    2. 所有地图内核公用一个,复用代码。
    3. 增加地图默认级别和中心点坐标设置参数。
    4. 主界面四个模块独立出来,做成了可配置,这样后期可以任意位置放置自定义模块。
    5. 四个模块标题栏自定义。
    6. vlc内核和mpv内核的离线判断,当句柄模式下,统一为getLastTime,当调用该函数的时候自动查询播放状态,如果正在播放则自动更新时间为当前时间。
    7. 将各种在代码中define定义不同内核的代码全部优化,统一为一个类,很大减少代码量,统一为CommonVideoWidget和CommonVideoManage类。

    V20201108

    1. 轮询点模块增加批量生成功能。
    2. 录像机、摄像机、轮询点,增加导入导出功能。
    3. ffmpeg内核增加读取帧回调,超时识别,可以快速识别掉线。

    20200828

    1. 增加了云台控制过滤,没有打开的视频禁用云台。
    2. linux上全屏BUG修复,采用showfullscreen。
    3. 增加轮询点管理模块。
    4. 修正轮询的可能崩溃的BUG。

    V20200730

    1. 系统设置增加了视频上传模块,用来将本地的视频文件传输到服务器,多线程并发。
    2. 视频监控内核新增MPV内核,修正了其他内核的部分函数和处理。
    3. 海康内核进行大改动,同时支持视频流和本地MP4文件播放,自动分析切换。
    4. 海康内核增加回调处理,可以拿到每一张图片。
    5. 海康内核进行了linux上的实验,可以正常播放。
    6. ffmpeg内核增加保存到MP4。
    7. 本地文件回放vlc部分增加进度切换等。
    8. 悬浮条关闭按钮增加实际处理,之前只是打印消息。
    9. 改进了vlc和mpv的事件回调机制,使其同时支持qt4+qt5。

    V20200620

    1. 增加了opengl显示实时视频,CPU占用极低。
    2. 增加了地图上设备点位置的调整。
    3. 设备点双击弹出实时视频预览。
    4. 增加GPS运动轨迹显示。
    5. ffmpeg解码类增加了音频播放,采用的QAudioOutput。

    V20191105

    1. 增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。
    2. 系统设置增加码流类型选择,默认子码流,切换完自动应用。
    3. 云台控制增加速度功能,值越大,速度越快。
    4. 增加焦距控制,可放大缩小,速度也可控制。

    1 用户登录退出

    1.1 用户登录

    +https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA  提取码: ujm7。

  • 如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。
  • 如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg,在ffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。
  • 如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。
  • 图形字体对照表在doc目录下的IconFont.png、Font Awesome Cheatsheet.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。
  • 如果发现地图打不开,请先确认file目录下的所有文件有没有拷贝过去。
  • 如果是用vs+qt可能报错 error LNK2026,解决办法详细见文档中其他说明。
  • 默认用户名admin 密码admin。
  • 系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。
  • 如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。
  • 0.6.3 离线地图

    1. 离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。
    2. 也可以直接下载网盘中已经下载好的上海市的离线地图。
    3. 下载地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取密码:01jf 文件名称:bin_map_tiles.zip

    使用说明

    1. 将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。
    2. tiles文件夹是街道图,tiles_hybrid文件夹是卫星图。
    3. 默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。
    4. 要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。

    0.7 视频格式

    0.7.1 USB摄像头

    1. 内核ffmpeg写法:video=USB2.0 PC CAMERA(具体要看设备名)。
    2. 内核vlc写法:dshow://:dshow-vdev=Default (或者填USB2.0 PC CAMERA)
    3. 带参数写法:2020-12-12以后增加USB摄像头直接url带分辨率帧率写法,默认分辨率640x480。

    写法举例

    1. video=USB2.0 PC CAMERA|1920x1080|30(表示1920*1080分辨率30帧)
    2. video=USB2.0 PC CAMERA|640x480(表示640*480分辨率)
    3. dshow://:dshow-vdev=USB2.0 PC CAMERA(表示打开视频设备USB2.0 PC CAMERA、其他参数全部默认)
    4. dshow://:dshow-vdev=USB2.0 PC CAMERA:dshow-adev=麦克风 (USB Audio Device):dshow-size=1920*1080:live-caching=300(表示打开视频设备USB2.0 PC CAMERA、打开音频设备麦克风 (USB Audio Device)、分辨率640x480、缓存时间300毫秒)

    0.7.2 网络地址

    1. 下面的地址有时候会失效,可以自行网上找找其他的地址,网络视频地址建议在晚上测试会更流畅。
    2. 大雄兔:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
    3. 大雄兔:http://r.ossrs.net/live/bbb.flv
    4. 海康萤石:https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8
    5. 在线摄像机:http://vts.simba-cn.com:280/gb28181/21100000001320000002.m3u8
    6. 摄像机格式:https://blog.csdn.net/qq_38880380/article/details/80652697

    0.7.3 中央卫视

    1. 中央卫视1:rtmp://58.200.131.2:1935/livetv/cctv1
    2. 中央卫视2:rtmp://58.200.131.2:1935/livetv/cctv2
    3. 中央卫视3:rtmp://58.200.131.2:1935/livetv/cctv3
    4. 中央卫视4:rtmp://58.200.131.2:1935/livetv/cctv4
    5. 中央卫视5:rtmp://58.200.131.2:1935/livetv/cctv5
    6. 中央卫视6:rtmp://58.200.131.2:1935/livetv/cctv6
    7. 中央卫视7:rtmp://58.200.131.2:1935/livetv/cctv7
    8. 中央卫视8:rtmp://58.200.131.2:1935/livetv/cctv8
    9. 中央卫视9:rtmp://58.200.131.2:1935/livetv/cctv9
    10. 中央卫视10:rtmp://58.200.131.2:1935/livetv/cctv10

    0.7.4 视频文件

    1. http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2. http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4
    3. http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4
    4. http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4

    0.7.5 网友提供

    1. rtmp://live.yihtc.com:10935/hls/stream_3
    2. rtmp://live.yihtc.com:10935/hls/stream_13
    3. rtmp://218.3.205.46/live/ggpd_sd
    4. rtmp://hls.hsrtv.cn/hls/hstv2
    5. rtmp://hls.hsrtv.cn/hls/hstv1
    6. rtmp://222.173.22.119:1935/live/jnyd_sd
    7. rtmp://222.173.22.119:1935/live/xwhd_hd
    8. rtmp://livetv.dhtv.cn:1935/live/peoples
    9. rtmp://livetv.dhtv.cn:1935/live/citylife
    10. rtmp://livetv.dhtv.cn:1935/live/financial
    11. rtmp://livetv.dhtv.cn:1935/live/news

    0.8 版本说明

    0.8.1 精益求精

    0.8.2 破茧成蝶

    V20211111

    1. ONVIF组件增加图片参数范围获取,之前默认0-255,有些设备是0-100 0-128之类的,获取后设置到滑动条范围。
    2. ONVIF组件增加网络参数设置,比如IP地址,子网掩码、网关地址、DNS设置等。
    3. ONVIF组件将结构体定义统一移到一个头文件onvifstruct.h,方便后期拓展管理。
    4. 预置位模块,调用、添加(调用)、删除三种功能,改成了以三个按钮的形式加到每个预置位信息的后面直接单击使用。之前是先选中预置位所在行,然后单击下面的按钮。

     

    V20211101

    1. 修正开启轮询后关闭所有视频通道不弹出提示信息。
    2. 所有信息框增加阴影边框区分突出显示,并跟随系统换肤自动更新边框阴影。
    3. 修正视频轮询分隔符,将|改成;因为如果是竖杠遇到带有参数的url则会出错。
    4. 将设备图片统一存放到config/device目录,之前在config目录下,随着越来越多非常凌乱。
    5. 修复之前通过信号执行通道切换,对应文字显示反了的BUG(通道1交换到通道2,新的通道2应该显示之前通道1的文本)。
    6. 将鼠标按下两个通道交换的处理代码,复用信号槽切换通道的函数。
    7. 将视频监控布局切换部分单独提取类VideoBox,专门负责管理各种通道布局切换,复用代码并且方便后期拓展,这部分代码和具体的处理无关,一直以来就想要单独提取出来进行管理,后期可以方便的增加其他异形布局以及255通道布局等,很多项目都用到了这个切换逻辑。
    8. 同时增加了布局切换子菜单比如13画面子菜单切换到52_64通道。
    9. 修复Qt6中视频控件悬浮条无法显示的BUG,因为Qt6将void enterEvent(QEvent *);改成了void enterEvent(QEnterEvent *);也不打个招呼。这种改变编译也不会提示的。
    10. 数据库组件修正sqlserver数据库必须设置数据源的不足,改成了dsn字符串形式,不需要新建数据源也能直接通信。
    11. 数据库组件修正mysql数据库必须存在默认数据库mysql的不足,改成了不需要默认数据库也能正常通信。
    12. 数据库组件修正没有默认数据库也能在建立连接后新建数据库操作。
    13. 数据库脚本执行将DROP DATABASE IF EXIST改成了DROP DATABASE ,这样无论什么时候都能先删除原来的数据库然后再新建数据库CREATE DATABASE。有些数据库不支持IF EXIST。

     

    V20211005

    1. 修正ffmpeg内核,在播放地址不存在的情况下,打开容易卡主引起崩溃的BUG,在打开回调函数中增加对线程停止标志位的判断,一旦在打开的回调中识别到需要停止线程则立即返回结束。
    2. 增加临时信息中间弹出框提示信息,比如一次性关闭所有通道的时候,界面会卡主的期间提示。
    3. 增加忙碌鼠标图标切换显示,忙完以后自动恢复鼠标样式。
    4. 修正ffmpeg内核,开始时间记录可能出现问题的BUG,会导致部分特殊MP4文件打不开。
    5. 应用程序关闭,增加全局退出信号关联到视频通道管理类,先关闭所有视频通道再彻底退出应用程序。不这样处理的话,发现vlc内核在开启了视频存储的时候,会关不掉程序。
    6. 修复在没有声音播放的情况下主动调用停止播放造成崩溃的BUG。
    7. 修复在linux系统上QUIWidget弹出的无边框窗体带系统标题栏的BUG。
    8. 修复ffmpeg内核关闭视频后opengl窗体来不及隐藏的BUG。
    9. 修复重复立即刷新打开所有通道,前一次还没执行后一次又来了的BUG,改成了定时器处理,在立即执行前将上一次还没来得及执行的先停止。
    10. 增加about关于对话框窗体,显示版本号、版权所有、网址、电话等信息。
    11. 所有弹出窗体都跟随软件主窗体默认居中,这个特性非常棒。
    12. 所有皮肤增加右键菜单选中图标样式、右键菜单二级子菜单右侧小三角箭头图标样式,单选框、复选框、禁用状态图标全部更新,从图形字体绘制,极其统一舒服。
    13. 着重对日志类savelog增加了最大行数、最大文件大小等参数设置,可以设置按照行数或者大小来自动分割日志文件。
    14. 日志类增加了可过滤不同的消息类型,不同消息类型增加消息头。
    15. 经过大量对比测试发现,使用miniblink浏览器内核,容易卡,说不定什么时候就失效了,问题集中在32位,64位的目前没有发现这个现象,webengine暂时没有这个现象,但是加载打开摄像机的网页配置,还是miniblink更优秀。
    16. 中文标题栏支持换行,既可以副标题写在英文标题上,也可以同等大小字体写在中文标题上。

    V20210922

    1. 视频控件边框增加0像素选项,这样看起来没有边框,有些场景需要无缝拼接。
    2. 修复当采用NVR通道作为摄像机视频流显示的时候,ONVIF处理索引越界崩溃的情况,因为一台NVR同一个IP地址对应多个摄像机。
    3. 所有样式17套皮肤更新边框颜色。
    4. 系统信息增加对应的编译器名字、位数、版本等。
    5. 演示demo增加视频叠加演示功能,比如在主视频的左上角、右上角、左下角、右下角在增加一个视频缩略图显示。
    6. 新增天气预报模块,可设置城市、采集间隔、展示样式等。
    7. 增加了vlc内核下USB摄像头格式自动纠正,如果采用ffmpeg的格式video=USB2.0 PC CAMERA|1920x1080自动纠正。
    8. 纠正vlc内核下USB摄像头不自动拉伸的BUG。
    9. 修正vlc内核动态保存视频文件,文件命名不符合规范,重新按照设定的重命名。
    10. 修复vlc内核中USB摄像头会当做rtsp视频流的BUG。
    11. 天气预报模块新增城市显示,新增双击弹出天气预报设置,含打印信息。
    12. 系统信息,增加秘钥文件的内容,比如允许的设备数量、到期日期等。
    13. 修复配置文件一旦新增加节点,之前节点全部初始值运行的BUG,应该是存在的节点则读取节点值,不存在的节点以初始值运行。

    V20210705

    1. 改进窗体居中显示算法,可设置参照窗体,默认基于当前屏幕中心,可设置参照主窗体则基于参照窗体,在大分辨率屏幕效果非常好,不然主窗体很小,弹个窗找不到还在很远的地方,还以为没有弹呢。
    2. 将登陆窗体、登出窗体、用户管理等公用界面,做成了通用库core_form。
    3. 修复MAC系统上无边框窗体无法最小化的BUG。
    4. 增加超级管理员密码A具有所有权限的机制,避免管理员误将系统设置权限取消后无法再次进去系统设置的问题。
    5. 图片参数增加锐度,图片参数设置滑块调节松开立即设置。
    6. 修复当没有启用图片地图的时候对应界面隐藏的时候保存设备坐标位置报错BUG,因为没有启用的情况下没有设置对应的对象指针。

    V20210603

    1. 将onvif搜索的用户密码,设备播放界面的设备密码等配置参数全部改成了密文存储。
    2. 大量修改代码,全部支持Qt4-Qt6所有版本。
    3. 调整onvif代码执行机制,改成了异步执行。
    4. 云台协议增加了连续移动。
    5. 增加了预置位相关处理,包括获取预置位、调用预置位、添加预置位、删除预置位。
    6. 自动巡航按照预置位集合进行,采用定时器去调用预置位队列。
    7. 增加图文警情行数、窗口信息行数配置,0行表示自动处理。
    8. 做了大量的代码改进,比如onvif内核换成了QDom对象处理,之前是采用的QXmlQuery查询,由于XmlPatterns这个模块逐渐废弃了,而且在Qt6中不再有,所以彻底移除了XmlPatterns相关的代码,改用其他处理方式实现。
    9. 增加了预置位和自动巡航处理,其中包括获取预置位集合、调用预置位、添加预置位、删除预置位、设置起始位、调用起始位等。
    10. ONVIF内核几乎全部重写,将数据改成了结构体,比如设备信息、预置位信息、事件信息等,可以存储更多的数据,拓展也非常灵活。
    11. onvif处理部分增加了对非onvif设备的过滤,通过判断是否存在onvif地址。这样可以大大加快处理速度,打开视频的时候去实例化onvif通信,关闭视频的时候删除对应的onvif类,这样可以动态响应。
    12. 所有onvif指令改成了线程处理,处理完成一个立马处理下一个,排队处理。

    V20210425

    1. 配置文件密码改成密文存储。
    2. 增加了无敌的牛逼的万能的完美入微级自动分页导航控件。
    3. 日志记录表增加索引,速度提升100倍以上。
    4. 新增多个设备轨迹 不同颜色+传入经纬度 单独示例。
    5. 对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数,可动态传入对应值。
    6. 系统设置增加用户管理模块,可分别设置对应的权限。
    7. 万能权限管理算法,通过设置不同需要授权的模块名称,对应切换的按钮自动计算。
    8. 增加了appkey秘钥类,用于校验秘钥是否正确,运行时间等。

    V20210403

    1. 增加全局变量AppData::LastLiveTime,记住程序最后的活动时间-包括键盘+鼠标活动,用于两个判断,一个是超过多久没有操作全屏下隐藏鼠标光标,一个是超过多久没有操作如果没有全屏则自动全屏。
    2. 增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。
    3. 重命名为TimeHideCursor表示程序多久未操作自动隐藏光标,TimeAutoFull程序多久未操作自动全屏界面,下拉框选项值增加0,表示不启用此功能。
    4. 增加信息列表模块frmMsgList,用于图文列表显示信息,对应兄弟类frmMsgTable用于表格显示消息。
    5. 大改版,将中间部分全部改成了QMainWindow,子模块全部采用停靠窗体,可以悬浮半透明,自动记忆每个模块的最后的位置,启动后自动应用。
    6. 移除大改版后的所有不需要用的变量和配置参数,重新调整配置参数。
    7. 增加透明度参数用于停靠窗体独立出来后的透明度。
    8. 将摄像机控制部分比如云台+控制+预置位+巡航,单独分类到ipc模块,方便管理。
    9. 限定操作员不能移动停靠窗体等,需要管理员设计好。
    10. 修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。
    11. 修复自动登录用户计算不正确的BUG,要以最后登录的用户为准。

    V20210322

    1. USB摄像头增加参数帧率,第二个参数是分辨率,第三个参数为帧率,不设置则采用默认的帧率,video=USB2.0 PC CAMERA|1920x1080|25。
    2. 增加独立的demo模块,专门用于测试监控系统中用到的组件和控件,演示如何使用,比如视频图片界面演示从文件夹读取图片绘制到窗体,视频窗体演示系统的核心组件视频控件的设置参数如何使用等。
    3. 增加了对其他数据库的支持,比如posgres、oracle、odbc、kingbase等数据库,理论上只要支持odbc数据源方式的都支持。
    4. 增加IndexStart启动窗体索引配置参数,0-主程序 1-演示示例。

    V20210305

    1. 修复数据库有时候没加载到的BUG。
    2. 新增配置参数控制画面切换的菜单和快捷图标是否显示。
    3. ffmpeg内核增加了可动态保存机制,点击开始保存按钮启动保存,单击结束则生成视频文件,如此往复。
    4. 海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。
    5. 新增多屏幕的支持,自动在对应屏幕最大化全屏,对话框位置,右下角提示框等。
    6. 再次分类存放代码文件,分成core ui class三大类。
    7. 系统配置更改视频控件参数,统一一个函数设置,initCommonVideoWidget函数中做了过滤,必须关闭状态的视频控件设置才起作用。
    8. 设备播放模块增加大华NVR的远程回放地址,其他地址计算算法调整。
    9. 新增界面模块功能启用配置参数。
    10. 新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。

    0.8.3 快速迭代

    V20201212

    1. 增加USB摄像机分辨率设置,直接url带掉。
    2. 所有地图内核公用一个,复用代码。
    3. 增加地图默认级别和中心点坐标设置参数。
    4. 主界面四个模块独立出来,做成了可配置,这样后期可以任意位置放置自定义模块。
    5. 四个模块标题栏自定义。
    6. vlc内核和mpv内核的离线判断,当句柄模式下,统一为getLastTime,当调用该函数的时候自动查询播放状态,如果正在播放则自动更新时间为当前时间。
    7. 将各种在代码中define定义不同内核的代码全部优化,统一为一个类,很大减少代码量,统一为CommonVideoWidget和CommonVideoManage类。

    V20201108

    1. 轮询点模块增加批量生成功能。
    2. 录像机、摄像机、轮询点,增加导入导出功能。
    3. ffmpeg内核增加读取帧回调,超时识别,可以快速识别掉线。

    20200828

    1. 增加了云台控制过滤,没有打开的视频禁用云台。
    2. linux上全屏BUG修复,采用showfullscreen。
    3. 增加轮询点管理模块。
    4. 修正轮询的可能崩溃的BUG。

    V20200730

    1. 系统设置增加了视频上传模块,用来将本地的视频文件传输到服务器,多线程并发。
    2. 视频监控内核新增MPV内核,修正了其他内核的部分函数和处理。
    3. 海康内核进行大改动,同时支持视频流和本地MP4文件播放,自动分析切换。
    4. 海康内核增加回调处理,可以拿到每一张图片。
    5. 海康内核进行了linux上的实验,可以正常播放。
    6. ffmpeg内核增加保存到MP4。
    7. 本地文件回放vlc部分增加进度切换等。
    8. 悬浮条关闭按钮增加实际处理,之前只是打印消息。
    9. 改进了vlc和mpv的事件回调机制,使其同时支持qt4+qt5。

    V20200620

    1. 增加了opengl显示实时视频,CPU占用极低。
    2. 增加了地图上设备点位置的调整。
    3. 设备点双击弹出实时视频预览。
    4. 增加GPS运动轨迹显示。
    5. ffmpeg解码类增加了音频播放,采用的QAudioOutput。

    V20191105

    1. 增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。
    2. 系统设置增加码流类型选择,默认子码流,切换完自动应用。
    3. 云台控制增加速度功能,值越大,速度越快。
    4. 增加焦距控制,可放大缩小,速度也可控制。

    1 用户登录退出

    1.1 用户登录

      系统默认开启了自动登录,可以在系统设置中将自动登录按钮关闭即可,可以在用户登录界面勾选记住密码和自动登录复选框,如果勾选了记住密码,则下次弹出的登录窗体会自动把最后一次的密码填进去,如果勾选了自动登录,则直接以上一次的用户登录到系统。

    1.2 用户退出

      如果开启了自动登录机制,在单击右上角的关闭按钮,会弹出用户退出窗体,需要输入密码才能退出,也可以在代码中屏蔽掉自动登录的判断,这样任何时候关闭系统都会弹出窗体要求输入密码来退出。用户登录和退出内置了超级密码 a ,在记不住密码或者密码丢失的时候使用。

    2 主界面操作

    @@ -768,7 +768,7 @@ header, .context-menu, .megamenu-content, footer{   云台移动总共有3种策略:绝对移动、相对移动、连续移动,本系统都支持三种策略,默认采用的连续移动,这也是大部分应用场景需要的,按下对应的方位进行移动,松开立即停止移动,非常人性化。

    9.5 设备控制

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

    9.6 预置位置

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

    9.7 巡航设置

    目前放在预置位中,后期可能会有改动。

    9.8 悬浮地图

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

    9.9 飞行轨迹

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

    9.10 飞行监控

    diff --git a/docs/video_system/snap/9-6-1.jpg b/docs/video_system/snap/9-6-1.jpg index 9b76b02e85c2200a7c4b421d7d138be9a27a65fb..890a02c3c9f21505bfb5470fbdfd524d86fcf720 100644 GIT binary patch literal 19852 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 diff --git a/flatui/flatui.h b/flatui/flatui.h index 5204b69..9308b09 100644 --- a/flatui/flatui.h +++ b/flatui/flatui.h @@ -51,11 +51,11 @@ public: //设置进度条样式 static QString setProgressQss(QProgressBar *bar, - int barHeight = 8, //进度条高度 - int barRadius = 5, //进度条半径 - int fontSize = 9, //文字字号 - const QString &normalColor = "#E8EDF2", //正常颜色 - const QString &chunkColor = "#E74C3C"); //进度颜色 + int barHeight = 8, //进度条高度 + int barRadius = 5, //进度条半径 + int fontSize = 9, //文字字号 + const QString &normalColor = "#E8EDF2", //正常颜色 + const QString &chunkColor = "#E74C3C"); //进度颜色 //设置滑块条样式 static QString setSliderQss(QSlider *slider, //滑动条对象 diff --git a/framelesswidget/framelesscore/framelessdialog.h b/framelesswidget/framelesscore/framelessdialog.h index b02bf20..6526d8e 100644 --- a/framelesswidget/framelesscore/framelessdialog.h +++ b/framelesswidget/framelesscore/framelessdialog.h @@ -1,6 +1,24 @@ #ifndef FRAMELESSDIALOG_H #define FRAMELESSDIALOG_H +/** + * 无边框窗体类 作者:feiyangqingyun(QQ:517216493) 2021-07-27 + * 1. 同时支持Qt4-Qt6,亲测Qt4.7到Qt6.2。 + * 2. 同时支持mingw、msvc、gcc等。 + * 3. 同时支持windows、linux、mac。 + * 4. 同时支持QMainWindow、QWidget、QDialog。 + * 5. 使用方法极其简单,只需要将继承类修改即可。 + * 6. 自动识别双击标题栏响应。 + * 7. 无边框拉伸在windows下不抖动。 + * 8. 在windows下具有移动到边缘半屏、移动到顶部全屏特性。 + * 9. 解决mac系统上无边框最小化最大化失效的BUG。 + * 10. 解决系统休眠后再次启动程序懵逼的BUG。 + * 11. 解决有时候窗体重新显示的时候假死不刷新的BUG。 + * 12. 轻量级,1个代码文件,核心代码行数不到300行。 + * 13. 注释详细,示例完美,非常适合阅读和学习。 + * 14. 开源开箱即用,保证任意Qt版本可正常编译运行,无需任何调整。 + */ + #include #ifdef quc diff --git a/framelesswidget/framelesscore/framelessmainwindow.h b/framelesswidget/framelesscore/framelessmainwindow.h index 36516cf..bee2452 100644 --- a/framelesswidget/framelesscore/framelessmainwindow.h +++ b/framelesswidget/framelesscore/framelessmainwindow.h @@ -1,6 +1,24 @@ #ifndef FRAMELESSMAINWINDOW_H #define FRAMELESSMAINWINDOW_H +/** + * 无边框窗体类 作者:feiyangqingyun(QQ:517216493) 2021-07-27 + * 1. 同时支持Qt4-Qt6,亲测Qt4.7到Qt6.2。 + * 2. 同时支持mingw、msvc、gcc等。 + * 3. 同时支持windows、linux、mac。 + * 4. 同时支持QMainWindow、QWidget、QDialog。 + * 5. 使用方法极其简单,只需要将继承类修改即可。 + * 6. 自动识别双击标题栏响应。 + * 7. 无边框拉伸在windows下不抖动。 + * 8. 在windows下具有移动到边缘半屏、移动到顶部全屏特性。 + * 9. 解决mac系统上无边框最小化最大化失效的BUG。 + * 10. 解决系统休眠后再次启动程序懵逼的BUG。 + * 11. 解决有时候窗体重新显示的时候假死不刷新的BUG。 + * 12. 轻量级,1个代码文件,核心代码行数不到300行。 + * 13. 注释详细,示例完美,非常适合阅读和学习。 + * 14. 开源开箱即用,保证任意Qt版本可正常编译运行,无需任何调整。 + */ + #include #ifdef quc diff --git a/framelesswidget/framelesscore/framelesswidget.h b/framelesswidget/framelesscore/framelesswidget.h index c6e1b67..a9f2fe3 100644 --- a/framelesswidget/framelesscore/framelesswidget.h +++ b/framelesswidget/framelesscore/framelesswidget.h @@ -1,6 +1,24 @@ #ifndef FRAMELESSWIDGET_H #define FRAMELESSWIDGET_H +/** + * 无边框窗体类 作者:feiyangqingyun(QQ:517216493) 2021-07-27 + * 1. 同时支持Qt4-Qt6,亲测Qt4.7到Qt6.2。 + * 2. 同时支持mingw、msvc、gcc等。 + * 3. 同时支持windows、linux、mac。 + * 4. 同时支持QMainWindow、QWidget、QDialog。 + * 5. 使用方法极其简单,只需要将继承类修改即可。 + * 6. 自动识别双击标题栏响应。 + * 7. 无边框拉伸在windows下不抖动。 + * 8. 在windows下具有移动到边缘半屏、移动到顶部全屏特性。 + * 9. 解决mac系统上无边框最小化最大化失效的BUG。 + * 10. 解决系统休眠后再次启动程序懵逼的BUG。 + * 11. 解决有时候窗体重新显示的时候假死不刷新的BUG。 + * 12. 轻量级,1个代码文件,核心代码行数不到300行。 + * 13. 注释详细,示例完美,非常适合阅读和学习。 + * 14. 开源开箱即用,保证任意Qt版本可正常编译运行,无需任何调整。 + */ + #include #ifdef quc diff --git a/maskwidget/maskwidget.h b/maskwidget/maskwidget.h index 1ce6ed8..9a608bf 100644 --- a/maskwidget/maskwidget.h +++ b/maskwidget/maskwidget.h @@ -30,13 +30,21 @@ protected: private: static QScopedPointer self; - QWidget *mainWidget; //需要遮罩的主窗体 - QStringList dialogNames; //可能弹窗的窗体对象名称集合链表 + + //需要遮罩的主窗体 + QWidget *mainWidget; + //需要弹窗的窗体对象名称集合链表 + QStringList dialogNames; public Q_SLOTS: + //设置需要遮罩的主窗体 void setMainWidget(QWidget *mainWidget); + //设置需要弹窗的窗体对象名称集合链表 void setDialogNames(const QStringList &dialogNames); + + //设置遮罩颜色 void setBgColor(const QColor &bgColor); + //设置颜色透明度 void setOpacity(double opacity); }; diff --git a/ntpclient/ntpclient.h b/ntpclient/ntpclient.h index b83c068..4192d24 100644 --- a/ntpclient/ntpclient.h +++ b/ntpclient/ntpclient.h @@ -4,7 +4,9 @@ /** * Ntp校时类 作者:feiyangqingyun(QQ:517216493) 2017-02-16 * 1. 可设置Ntp服务器IP地址。 - * 2. 收到时间信号发出。 + * 2. 推荐用默认的阿里云时间服务器 ntp1.aliyun.com + * 3. 收到时间信号发出。 + * 4. 时间精确到秒。 */ #include @@ -33,15 +35,15 @@ private slots: void sendData(); void setTime_t(uint secsSince1Jan1970UTC); -signals: - //收到时间返回 - void receiveTime(const QDateTime &dateTime); - -public slots: - //设置NTP服务器IP +public Q_SLOTS: + //设置Ntp服务器IP void setNtpIP(const QString &ntpIP); //获取日期时间 void getDateTime(); + +Q_SIGNALS: + //收到时间返回 + void receiveTime(const QDateTime &dateTime); }; #endif // NTPCLIENT_H diff --git a/savelog/savelog.cpp b/savelog/savelog.cpp index 7832988..375dea4 100644 --- a/savelog/savelog.cpp +++ b/savelog/savelog.cpp @@ -34,7 +34,7 @@ void Log(QtMsgType type, const char *msg) content = QString("Debug %1").arg(msg); } break; -#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0)) +#if (QT_VERSION >= QT_VERSION_CHECK(5,5,0)) case QtInfoMsg: if ((msgType & MsgType_Info) == MsgType_Info) { content = QString("Infox %1").arg(msg); diff --git a/screenwidget/screenwidget.h b/screenwidget/screenwidget.h index c91b2ee..8e9c34d 100644 --- a/screenwidget/screenwidget.h +++ b/screenwidget/screenwidget.h @@ -3,9 +3,11 @@ /** * 全局截屏控件 作者:feiyangqingyun(QQ:517216493) 2016-11-11 - * 1. 支持鼠标右键选择菜单。 - * 2. 支持全局截屏和局部截屏。 - * 3. 支持图片另存为。 + * 1. 鼠标右键弹出菜单。 + * 2. 支持全局截屏。 + * 3. 支持局部截屏。 + * 4. 支持截图区域拖动。 + * 5. 支持图片另存为。 */ #include @@ -33,16 +35,24 @@ public: int width(); int height(); - bool isInArea(QPoint pos); // 检测pos是否在截图区域内 - void move(QPoint p); // 按 p 移动截图区域 + + //检测坐标点是否在截图区域内 + bool isInArea(QPoint pos); + //按坐标移动截图区域 + void move(QPoint p); private: - QPoint leftUpPos, rightDownPos; //记录 截图区域 左上角、右下角 - QPoint startPos, endPos; //记录 鼠标开始位置、结束位置 - int maxWidth, maxHeight; //记录屏幕大小 - STATUS status; //三个状态: 选择区域、移动区域、设置width height + //记录 截图区域 左上角、右下角 + QPoint leftUpPos, rightDownPos; + //记录 鼠标开始位置、结束位置 + QPoint startPos, endPos; + //记录屏幕大小 + int maxWidth, maxHeight; + //三个状态: 选择区域、移动区域、设置width height + STATUS status; - void cmpPoint(QPoint &s, QPoint &e);//比较两位置,判断左上角、右下角 + //比较两位置,判断左上角、右下角 + void cmpPoint(QPoint &s, QPoint &e); }; #ifdef quc