zoukankan      html  css  js  c++  java
  • Qt开源作品6-通用视频控件

    一、前言

    在之前做的视频监控系统中,根据不同的用户需要,做了好多种视频监控内核,有ffmpeg内核的,有vlc内核的,有mpv内核的,还有海康sdk内核的,为了做成通用的功能,不同内核很方便的切换,比如pro直接改一个DEFINE的变量名,所以需要将各种内核的使用方法做成一样的接口,这样看起来就很整齐,所以后面特意提炼了一个通用的视频控件,该控件没有具体的视频播放控制功能,需要根据不同的内核去调用具体的方法实现,后面还需要增加大华sdk或者其他第三方厂家的协议的时候,直接套用这个通用视频控件即可。

    通用视频控件功能:

    1. 可设置边框大小
    2. 可设置边框颜色
    3. 可设置两路OSD标签
    4. 可设置是否绘制OSD标签
    5. 可设置标签文本或图片
    6. 可设置OSD位置 左上角+左下角+右上角+右下角
    7. 可设置OSD风格 文本+日期+时间+日期时间+图片
    8. 自定义半透明悬浮窗体,一排按钮
    9. 悬浮按钮可自定义设置,包括背景颜色+按下颜色
    10. 发送信号通知单击了哪个悬浮按钮
    11. 能够识别拖进来的文件,通知url
    12. 提供open close pause等接口

    二、代码思路

    //设置悬浮条
    //顶部工具栏,默认隐藏,鼠标移入显示移除隐藏
    flowPanel = new QWidget(this);
    flowPanel->setObjectName("flowPanel");
    flowPanel->setVisible(false);
    
    //用布局顶住,左侧弹簧
    QHBoxLayout *layout = new QHBoxLayout;
    layout->setSpacing(2);
    layout->setMargin(0);
    layout->addStretch();
    flowPanel->setLayout(layout);
    
    //按钮集合名称,如果需要新增按钮则在这里增加即可
    QList<QString> btns;
    btns << "btnFlowVideo" << "btnFlowSnap" << "btnFlowSound" << "btnFlowAlarm" << "btnFlowClose";
    
    void VideoWidget::resizeEvent(QResizeEvent *)
    {
        //重新设置顶部工具栏的位置和宽高,可以自行设置顶部显示或者底部显示
        int height = 20;
        flowPanel->setGeometry(borderWidth, borderWidth, this->width() - (borderWidth * 2), height);
        //flowPanel->setGeometry(borderWidth, this->height() - height - borderWidth, this->width() - (borderWidth * 2), height);
    }
    
    void VideoWidget::enterEvent(QEvent *)
    {
        //这里还可以增加一个判断,是否获取了焦点的才需要显示
        //if (this->hasFocus()) {}
        if (flowEnable) {
            flowPanel->setVisible(true);
        }
    }
    
    void VideoWidget::leaveEvent(QEvent *)
    {
        if (flowEnable) {
            flowPanel->setVisible(false);
        }
    }
    
    //支持拖曳识别
    void VideoWidget::dropEvent(QDropEvent *event)
    {
        //拖放完毕鼠标松开的时候执行
        //判断拖放进来的类型,取出文件,进行播放
        if(event->mimeData()->hasUrls()) {
            QString url = event->mimeData()->urls().first().toLocalFile();
            this->close();
            this->setUrl(url);
            this->open();
            emit fileDrag(url);
        } else if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
            QTreeWidget *treeWidget = (QTreeWidget *)event->source();
            if (treeWidget != 0) {
                QString url = treeWidget->currentItem()->data(0, Qt::UserRole).toString();
                this->close();
                this->setUrl(url);
                this->open();
                emit fileDrag(url);
            }
        }
    }
    
    void VideoWidget::dragEnterEvent(QDragEnterEvent *event)
    {
        //拖曳进来的时候先判断下类型,非法类型则不处理
        if(event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
            event->setDropAction(Qt::CopyAction);
            event->accept();
        } else if(event->mimeData()->hasFormat("text/uri-list")) {
            event->setDropAction(Qt::LinkAction);
            event->accept();
        } else {
            event->ignore();
        }
    }
    

    三、效果图

    四、开源主页

    以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

    1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
    2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
    3. 个人主页:https://blog.csdn.net/feiyangqingyun
    4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  • 相关阅读:
    Gym
    Gym 100712H
    CodeForces
    CodeForces
    P1103 书本整理(DP)
    P1435 回文子串(最长公共子序列)
    P1095 守望者的逃离(线性DP)
    P1077 摆花(背包)
    P1832 A+B Problem(再升级)
    P1757 通天之分组背包(分组背包)
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/12866986.html
Copyright © 2011-2022 走看看