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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM