Qt编写视频监控系统79-四种界面导航栏的设计

news2024/12/20 12:01:45

一、前言

最初视频监控系统按照二级菜单的设计思路,顶部标题栏一级菜单,左侧对应二级菜单,最初采用图片在上面,文字在下面的按钮方式展示,随着功能的增加,二级菜单越来越多,如果都是这个图文上下排列的按钮,那左侧高度空间不够,比如在笔记本1366x768的分辨率上,左侧如果有七八个菜单按钮,那就摆不下了,会把界面撑大导致有些界面看不到,在一整个屏幕上看不全,所以才想着把导航菜单设计成了动态展示的方案,根据菜单的名字,自动生成对应的菜单按钮,图片位置可选是在上面还是在左侧,所以产生了四种菜单排列组合,上侧+上侧,上侧+左侧,左侧+上侧,左侧+左侧,可以由用户自己在系统设置中切换即可。

二、效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、体验地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system。

四、相关代码

void frmMain::initNav()
{
    QList<QString> names, texts;
    names << "btnView" << "btnVideo" << "btnMap" << "btnMain1" << "btnData" << "btnConfig";
    texts << "视频监控" << "视频回放" << "电子地图" << AppData::TitleMain1 << "日志查询" << "系统设置";
    icons << 0xe68c << 0xe68d << 0xe695 << AppData::IconMain1 << 0xe699 << 0xe706;

    //根据设定实例化导航按钮对象
    for (int i = 0; i < texts.count(); ++i) {
        QToolButton *btn = new QToolButton;
        CommonNav::initNavBtn(btn, names.at(i), texts.at(i), false);
        connect(btn, SIGNAL(clicked(bool)), this, SLOT(buttonClicked()));
        ui->layoutNav->addWidget(btn);
        btns << btn;
    }
}

void CommonNav::initNavLayout(QWidget *widget, QLayout *layout, bool left)
{
    //不同的样式边距和图标大小不一样,可以自行调整对应值看效果
    int topMargin, otherMargin;
    if (left) {

    } else {
        if (CommonNav::NavMainLeft) {
            topMargin = widget->height() + 6;
            otherMargin = 9;
        } else {
            topMargin = 3;
            otherMargin = 3;
        }
    }

    layout->setContentsMargins(otherMargin, topMargin, otherMargin, otherMargin);
}

void CommonNav::initNavBtn(QToolButton *btn, const QString &name, const QString &text, bool left)
{
    btn->setObjectName(name);
    btn->setText(text);
    btn->setCheckable(true);

    //顶部导航和左侧导航拉伸策略不一样
    if (left) {
        btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
        if (CommonNav::NavSubLeft) {
            btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
            btn->setMinimumHeight(30);
        } else {
            btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
            btn->setMinimumHeight(80);
        }

    } else {
        btn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
        if (CommonNav::NavMainLeft) {
            btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
            btn->setMinimumWidth(115);
        } else {
            btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
            btn->setMinimumWidth(80);
        }
    }
}

void CommonNav::initNavBtnIcon(QAbstractButton *btn, int icon, bool left, int offset)
{
    //可以自行调整尺寸
    int size = 20;
    int width = 25;
    int height = 20;

    //根据不同的图标位置设置不同的图标尺寸
    if (left) {
        if (!CommonNav::NavSubLeft) {
            size = 35;
            width = 40;
            height = 35;
        }
    } else {
        if (!CommonNav::NavMainLeft) {
            size = 35;
            width = 40;
            height = 35;
        }
    }

    //偏移值 可能部分图标要调整大小
    size += offset;
    setIconBtn(btn, icon, size, width, height);
}

void CommonNav::setIconBtn(QAbstractButton *btn, int icon)
{
    //可以自行调整尺寸
    int size = 16;
    int width = 18;
    int height = 18;
    setIconBtn(btn, icon, size, width, height);
}

void CommonNav::setIconBtn(QAbstractButton *btn, int icon, int size, int width, int height, int fontSize)
{
    //取出正常状态和禁用状态图片
    QPixmap pixNormal = IconHelper::getPixmap(QUIConfig::TextColor, icon, size, width, height);
    QPixmap pixDisabled = IconHelper::getPixmap(QUIConfig::BorderColor, icon, size, width, height);

    QIcon ico(pixNormal);
    ico.addPixmap(pixDisabled, QIcon::Disabled, QIcon::On);
    ico.addPixmap(pixDisabled, QIcon::Disabled, QIcon::Off);

    btn->setIconSize(QSize(width, height));
    btn->setIcon(ico);
    if (fontSize > 0) {
        QFont font;
        font.setPixelSize(fontSize);
        btn->setFont(font);
    }
}

五、功能特点

5.1 软件模块

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

5.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. 支持onvif图像参数设置,包括明亮度、对比度、饱和度、尖锐度等。
  24. 支持onvif其他操作,包括抓图、网络设置、校时、重启、事件订阅等。
  25. 支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
  26. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
  27. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
  28. 可设置软件中文名称、英文名称、LOGO图标等。
  29. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。
  30. 完善的录像计划设置,支持每个通道7 * 24小时每半小时设置是否存储录像。

5.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. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。
  17. 支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
  18. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openGauss数据库安装,配置连接 完整版Centos7

服务器版本&#xff1a;Centos7.6 || 7.9 数据库版本&#xff1a;openGauss-5.0.0-CentOS-64bit.tar.bz2 极简版 目录 修改系统参数安装环境安装openGauss数据库配置连接数据库使用navicat连接数据库 修改系统参数 ##修改 /etc/selinux/config 文件中的“SELINUX”值为“disa…

【网络安全】成功上岸深信服,这套面试题你肯定需要!!!

时间过得很快&#xff0c;回想起去年的这个时候&#xff0c;我也正在准备秋招&#xff0c;今天的我刚刚结束培训。 我的个人情况就读于某双非大学&#xff0c;信息与计算科学&#xff08;大数据方向&#xff0c;校企合作&#xff0c;一个介于数学与计算机之间的专业&#xff0…

移动端H5使用window.open跳转,IOS不生效解决

移动端H5使用window.open跳转&#xff0c;IOS不生效解决 navigator navigator对象&#xff0c;用于提供当前浏览器及操作系统等信息&#xff0c;这些信息都放在navigator的各个属性中。navigator对象也是window对象的成员。 打印navigator对象 userAgent在安卓和IOS的打印结…

Opencv-C++笔记 (9) : opencv-多通道分离和合并

文章目录 一、概论二、多通道分离函数split()三、多通道合并函数merge()四、图像多通道分离与合并例程 一、概论 在图像颜色模型中不同的分量存放在不同的通道中&#xff0c;如果我们只需要颜色模型的某一个分量&#xff0c;例如只需要处理RGB图像中的红色通道&#xff0c;可以…

科技云报道:大模型时代,SaaS元年才真的到来了?

科技云报道原创。 ChatGPT席卷全球后&#xff0c;如果有人问AI大模型影响最大的会是哪个行业&#xff1f;SaaS领域肯定是不二之选。 目前全球各大科技公司已宣称要用大模型触及、整合所有产品。 其中&#xff0c;微软率先为其办公家族装配上了各类copilot&#xff0c;开发者…

Opencv-C++笔记 (10) : opencv-图像像素计算

文章目录 一、概率寻找图像像素的最大值和最小值计算图像的均值和标准方差 一、概率 我们可以将数字图像理解成一定尺寸的矩阵&#xff0c;矩阵中每个元素的大小表示了图像中每个像素的亮暗程度&#xff0c;因此统计矩阵中的最大值&#xff0c;就是寻找图像中灰度值最大的像素…

人机交互学习-7 可视化设计

可视化设计 窗口与菜单窗口窗口Window窗口界面类型 菜单注意事项 对话框模态对话框非模态对话框属性对话框功能对话框进度对话框公告对话框错误对话框消除错误信息 警告对话框确认对话框消除确认对话框 管理对话框内容标签对话框扩展对话框级联对话框 对话框设计原则 控件工具栏…

内部类~~

1&#xff1a;一个类中再定义一个类 2&#xff1a;内部类的使用场景&#xff0c;作用 当一个事物的内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整结构又只为外部事物提供服务&#xff0c;那么整个内部的完整结构可以选择使用内部类来设…

“大龄”码农的“中年危机”:35岁之后,IT计算机的出路在哪?

前言 对于一个工作不下于4年的人来说&#xff0c;我觉得我有一定的思考沉淀来回答这个问题。 说说我的一些经历吧。 普通一本毕业&#xff0c;专业是自动化&#xff0c;大学由于挂科太多没拿到学位证到上海找实习&#xff0c;一开始做的是开发&#xff0c;从16年到19年都是做…

警惕冒充“数字人民币”诈骗案!

现在大家越来越习惯使用电子支付的方式&#xff0c;数字支付方式的需求也在不断增长。然而一些犯罪嫌疑人却看到了可乘之机&#xff0c;近日&#xff0c;山东菏泽曹县警方破获了一起利用数字人民币&#xff0c;实施诈骗的案件&#xff0c;受骗群众高达上万人。 家住山东菏泽曹…

基于浏览器渲染的组件测试

目录 为什么需要自动化测试 测试的类型 组件测试的方式 白盒测试 黑盒测试 灰盒测试 推荐的方案 Playwright 组件测试案例 Playwright 简介 playwright 架构图 BrowserContext 组件测试原理 组件引入 模型封装 组件渲染测试 组件 Props 测试 组件 Events 测试…

运维数字化转型:用数字化思维重塑运维体系(文末送书五本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

基于Java学生请假系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

FDTD 时域有限差分数值模拟方法与应用,COMSOL 多场耦合仿真技术与应用

专题一&#xff1a;COMSOL多物理场耦合 &#xff08;一&#xff09;案列应用实操教学&#xff1a; 案例一 光子晶体能带分析、能谱计算、光纤模态计算、微腔腔膜求解 案例二 类比凝聚态领域魔角石墨烯的moir 光子晶体建模以及物理分析 案例三 传播表面等离激元和表面等离…

Cat.4网络DTU,稳定快速的数据传输神器

好兄弟们&#xff01;你们有没有遇到过&#xff0c;半夜在家睡得正香&#xff0c;突然领导一个电话干过来告诉你设备数据传输中断了&#xff0c;让你赶紧看看怎么回事的情况。简直让人崩溃&#xff01; 在现代工业和物联网应用中&#xff0c;数据传输的稳定性和速度对于设备的运…

Python-Inspect.exe-uiautomation-基本操作-获取微信群成员信息

文章目录 1.Inspect.exe2.uiautomation使用2.1.简介和安装2.2.获取微信群成员昵称2.3.常用控件类型2.4.比较通用的属性2.4.窗口常见操作2.5.常见鼠标和键盘操作3.总结1.Inspect.exe 检查 (Inspect.exe) 是一种基于 Windows 的工具,可以选择任何 UI 元素并查看其辅助功能数据。…

ASEMI代理光宝光耦LTV-5314资料,LTV-5314规格书

编辑-Z 在电子设备的设计和制造过程中&#xff0c;光耦合器是一种至关重要的组件。它们在电路中起到隔离作用&#xff0c;防止电流反向流动&#xff0c;从而保护设备免受损坏。其中&#xff0c;光耦LTV-5314是一种广受欢迎的光耦合器&#xff0c;以其卓越的性能和可靠的稳定性…

MaxCompute-批量导出项目空间的建表语句(DDL)

MaxCompute-批量导出项目空间的建表语句&#xff08;DDL&#xff09; 项目背景 最近需要做项目空间的数据备份&#xff0c;包括表结构&#xff08;建表语句&#xff09;&#xff0c;以便在系统出现问题时&#xff0c;或者数据丢失时进行恢复。 所遇问题 前面我介绍过MaxCom…

【算法】原地哈希与快速幂

文章目录 一、原地哈希二、快速幂2.1 指数无负数2.2 指数有负数 一、原地哈希 直接看例题&#xff1a;题目链接 题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间…

【机器学习】十大算法之一 “SVM”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…