一、前言
在之前做的視訊監控系統中,根據不同的使用者需要,做了好多種視訊監控核心,有ffmpeg核心的,有vlc核心的,有mpv核心的,還有海康sdk核心的,為了做成通用的功能,不同核心很友善的切換,比如pro直接改一個DEFINE的變量名,是以需要将各種核心的使用方法做成一樣的接口,這樣看起來就很整齊,是以後面特意提煉了一個通用的視訊控件,該控件沒有具體的視訊播放控制功能,需要根據不同的核心去調用具體的方法實作,後面還需要增加大華sdk或者其他第三方廠家的協定的時候,直接套用這個通用視訊控件即可。
通用視訊控件功能:
- 可設定邊框大小
- 可設定邊框顔色
- 可設定兩路OSD标簽
- 可設定是否繪制OSD标簽
- 可設定标簽文本或圖檔
- 可設定OSD位置 左上角+左下角+右上角+右下角
- 可設定OSD風格 文本+日期+時間+日期時間+圖檔
- 自定義半透明懸浮窗體,一排按鈕
- 懸浮按鈕可自定義設定,包括背景顔色+按下顔色
- 發送信号通知單擊了哪個懸浮按鈕
- 能夠識别拖進來的檔案,通知url
- 提供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();
}
}
三、效果圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL3cDZwADOxYzN2gDMxgTOzIzM1MzMjVWO3QjMmFDO4ATZ4IGOjlTOy8CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
四、開源首頁
以上作品完整源碼下載下傳都在開源首頁,會持續不斷更新作品數量和品質,歡迎各位關注。