From 72a8f2e2e4d36a14393eaab470eef151358178dd Mon Sep 17 00:00:00 2001 From: feiyangqingyun Date: Thu, 19 Dec 2019 09:48:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=9A=E7=94=A8=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- snap/videowidget.gif | Bin 0 -> 89798 bytes videowidget/frmvideowidget.cpp | 35 ++ videowidget/frmvideowidget.h | 26 ++ videowidget/frmvideowidget.ui | 85 ++++ videowidget/main.cpp | 32 ++ videowidget/videowidget.cpp | 788 +++++++++++++++++++++++++++++++++ videowidget/videowidget.h | 314 +++++++++++++ videowidget/videowidget.pro | 23 + 9 files changed, 1306 insertions(+), 1 deletion(-) create mode 100644 snap/videowidget.gif create mode 100644 videowidget/frmvideowidget.cpp create mode 100644 videowidget/frmvideowidget.h create mode 100644 videowidget/frmvideowidget.ui create mode 100644 videowidget/main.cpp create mode 100644 videowidget/videowidget.cpp create mode 100644 videowidget/videowidget.h create mode 100644 videowidget/videowidget.pro diff --git a/README.md b/README.md index 1782df8..391acfa 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ | 27 | emailtool | 邮件发送工具 | | 28 | ntpclient | NTP服务器时间同步 | | 29 | lunarcalendarwidget | 农历控件 | +| 30 | videowidget | 通用视频控件 | ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/lightbutton.gif) ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/movewidget.gif) @@ -59,4 +60,5 @@ ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/mouseline.gif) ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/emailtool.gif) ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/ntpclient.gif) -![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/lunarcalendarwidget.gif) \ No newline at end of file +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/lunarcalendarwidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/videowidget.gif) \ No newline at end of file diff --git a/snap/videowidget.gif b/snap/videowidget.gif new file mode 100644 index 0000000000000000000000000000000000000000..be5609f40ec0ecf598748f2675870e63b1924c31 GIT binary patch literal 89798 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 literal 0 HcmV?d00001 diff --git a/videowidget/frmvideowidget.cpp b/videowidget/frmvideowidget.cpp new file mode 100644 index 0000000..f4fc519 --- /dev/null +++ b/videowidget/frmvideowidget.cpp @@ -0,0 +1,35 @@ +#pragma execution_character_set("utf-8") + +#include "frmvideowidget.h" +#include "ui_frmvideowidget.h" + +frmVideoWidget::frmVideoWidget(QWidget *parent) : QWidget(parent), ui(new Ui::frmVideoWidget) +{ + ui->setupUi(this); + this->initForm(); +} + +frmVideoWidget::~frmVideoWidget() +{ + delete ui; +} + +void frmVideoWidget::initForm() +{ + ui->videoWidget1->setFlowEnable(true); + ui->videoWidget2->setFlowEnable(true); + ui->videoWidget3->setFlowEnable(true); + ui->videoWidget4->setFlowEnable(true); + + connect(ui->videoWidget1, SIGNAL(btnClicked(QString)), this, SLOT(btnClicked(QString))); + connect(ui->videoWidget2, SIGNAL(btnClicked(QString)), this, SLOT(btnClicked(QString))); + connect(ui->videoWidget3, SIGNAL(btnClicked(QString)), this, SLOT(btnClicked(QString))); + connect(ui->videoWidget4, SIGNAL(btnClicked(QString)), this, SLOT(btnClicked(QString))); +} + +void frmVideoWidget::btnClicked(const QString &objName) +{ + VideoWidget *videoWidget = (VideoWidget *)sender(); + QString str = QString("当前单击了控件 %1 的按钮 %2").arg(videoWidget->objectName()).arg(objName); + ui->label->setText(str); +} diff --git a/videowidget/frmvideowidget.h b/videowidget/frmvideowidget.h new file mode 100644 index 0000000..c12a88a --- /dev/null +++ b/videowidget/frmvideowidget.h @@ -0,0 +1,26 @@ +#ifndef FRMVIDEOWIDGET_H +#define FRMVIDEOWIDGET_H + +#include + +namespace Ui { +class frmVideoWidget; +} + +class frmVideoWidget : public QWidget +{ + Q_OBJECT + +public: + explicit frmVideoWidget(QWidget *parent = 0); + ~frmVideoWidget(); + +private: + Ui::frmVideoWidget *ui; + +private slots: + void initForm(); + void btnClicked(const QString &objName); +}; + +#endif // FRMVIDEOWIDGET_H diff --git a/videowidget/frmvideowidget.ui b/videowidget/frmvideowidget.ui new file mode 100644 index 0000000..014ea15 --- /dev/null +++ b/videowidget/frmvideowidget.ui @@ -0,0 +1,85 @@ + + + frmVideoWidget + + + + 0 + 0 + 500 + 300 + + + + Form + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + QFrame::Box + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + + VideoWidget + QWidget +
videowidget.h
+ 1 +
+
+ + +
diff --git a/videowidget/main.cpp b/videowidget/main.cpp new file mode 100644 index 0000000..8b7d649 --- /dev/null +++ b/videowidget/main.cpp @@ -0,0 +1,32 @@ +#pragma execution_character_set("utf-8") + +#include "frmvideowidget.h" +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + a.setFont(QFont("Microsoft Yahei", 9)); + +#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) +#if _MSC_VER + QTextCodec *codec = QTextCodec::codecForName("gbk"); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); +#endif + QTextCodec::setCodecForLocale(codec); + QTextCodec::setCodecForCStrings(codec); + QTextCodec::setCodecForTr(codec); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); + QTextCodec::setCodecForLocale(codec); +#endif + + frmVideoWidget w; + w.setWindowTitle("视频监控控件"); + w.resize(800, 600); + w.show(); + + return a.exec(); +} diff --git a/videowidget/videowidget.cpp b/videowidget/videowidget.cpp new file mode 100644 index 0000000..039fc13 --- /dev/null +++ b/videowidget/videowidget.cpp @@ -0,0 +1,788 @@ +#pragma execution_character_set("utf-8") + +#include "videowidget.h" +#include "qfontdatabase.h" +#include "qpushbutton.h" +#include "qtreewidget.h" +#include "qlayout.h" +#include "qtimer.h" +#include "qdir.h" +#include "qpainter.h" +#include "qevent.h" +#include "qmimedata.h" +#include "qurl.h" +#include "qdebug.h" + +VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent) +{ + //设置强焦点 + setFocusPolicy(Qt::StrongFocus); + //设置支持拖放 + setAcceptDrops(true); + + timerCheck = new QTimer(this); + timerCheck->setInterval(10 * 1000); + connect(timerCheck, SIGNAL(timeout()), this, SLOT(checkVideo())); + + image = QImage(); + + //顶部工具栏,默认隐藏,鼠标移入显示移除隐藏 + 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 btns; + btns << "btnFlowVideo" << "btnFlowSnap" << "btnFlowSound" << "btnFlowAlarm" << "btnFlowClose"; + + //有多种办法来设置图片,qt内置的图标+自定义的图标+图形字体 + //既可以设置图标形式,也可以直接图形字体设置文本 +#if 0 + QList icons; + icons << QApplication::style()->standardIcon(QStyle::SP_ComputerIcon); + icons << QApplication::style()->standardIcon(QStyle::SP_FileIcon); + icons << QApplication::style()->standardIcon(QStyle::SP_DirIcon); + icons << QApplication::style()->standardIcon(QStyle::SP_DialogOkButton); + icons << QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton); +#else + QList chars; + chars << 0xe68d << 0xe672 << 0xe674 << 0xea36 << 0xe74c; + + //判断图形字体是否存在,不存在则加入 + QFont iconFont; + QFontDatabase fontDb; + if (!fontDb.families().contains("iconfont")) { + int fontId = fontDb.addApplicationFont(":/image/iconfont.ttf"); + QStringList fontName = fontDb.applicationFontFamilies(fontId); + if (fontName.count() == 0) { + qDebug() << "load iconfont.ttf error"; + } + } + + if (fontDb.families().contains("iconfont")) { + iconFont = QFont("iconfont"); + iconFont.setPixelSize(17); +#if (QT_VERSION >= QT_VERSION_CHECK(4,8,0)) + iconFont.setHintingPreference(QFont::PreferNoHinting); +#endif + } +#endif + + //循环添加顶部按钮 + for (int i = 0; i < btns.count(); i++) { + QPushButton *btn = new QPushButton; + //绑定按钮单击事件,用来发出信号通知 + connect(btn, SIGNAL(clicked(bool)), this, SLOT(btnClicked())); + //设置标识,用来区别按钮 + btn->setObjectName(btns.at(i)); + //设置固定宽度 + btn->setFixedWidth(20); + //设置拉伸策略使得填充 + btn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + //设置焦点策略为无焦点,避免单击后焦点跑到按钮上 + btn->setFocusPolicy(Qt::NoFocus); + +#if 0 + //设置图标大小和图标 + btn->setIconSize(QSize(16, 16)); + btn->setIcon(icons.at(i)); +#else + btn->setFont(iconFont); + btn->setText(chars.at(i)); +#endif + + //将按钮加到布局中 + layout->addWidget(btn); + } + + copyImage = false; + checkLive = true; + drawImage = true; + fillImage = true; + + flowEnable = false; + flowBgColor = "#000000"; + flowPressColor = "#5EC7D9"; + + timeout = 20; + borderWidth = 5; + borderColor = "#000000"; + focusColor = "#22A3A9"; + bgText = "实时视频"; + bgImage = QImage(); + + osd1Visible = false; + osd1FontSize = 12; + osd1Text = "时间"; + osd1Color = "#FF0000"; + osd1Image = QImage(); + osd1Format = OSDFormat_DateTime; + osd1Position = OSDPosition_Right_Top; + + osd2Visible = false; + osd2FontSize = 12; + osd2Text = "通道名称"; + osd2Color = "#FF0000"; + osd2Image = QImage(); + osd2Format = OSDFormat_Text; + osd2Position = OSDPosition_Left_Bottom; + + this->initFlowStyle(); +} + +VideoWidget::~VideoWidget() +{ + if (timerCheck->isActive()) { + timerCheck->stop(); + } + + close(); +} + +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(); + } +} + +void VideoWidget::paintEvent(QPaintEvent *) +{ + //如果不需要绘制 + if (!drawImage) { + return; + } + + //qDebug() << TIMEMS << "paintEvent" << objectName(); + QPainter painter(this); + painter.setRenderHints(QPainter::Antialiasing); + + //绘制边框 + drawBorder(&painter); + + if (!image.isNull()) { + //绘制背景图片 + drawImg(&painter, image); + + //绘制标签1 + if (osd1Visible) { + drawOSD(&painter, osd1FontSize, osd1Text, osd1Color, osd1Image, osd1Format, osd1Position); + } + + //绘制标签2 + if (osd2Visible) { + drawOSD(&painter, osd2FontSize, osd2Text, osd2Color, osd2Image, osd2Format, osd2Position); + } + } else { + //绘制背景 + drawBg(&painter); + } +} + +void VideoWidget::drawBorder(QPainter *painter) +{ + painter->save(); + QPen pen; + pen.setWidth(borderWidth); + pen.setColor(hasFocus() ? focusColor : borderColor); + painter->setPen(pen); + painter->drawRect(rect()); + painter->restore(); +} + +void VideoWidget::drawBg(QPainter *painter) +{ + painter->save(); + + //背景图片为空则绘制文字,否则绘制背景图片 + if (bgImage.isNull()) { + painter->setPen(palette().foreground().color()); + painter->drawText(rect(), Qt::AlignCenter, bgText); + } else { + //居中绘制 + int pixX = rect().center().x() - bgImage.width() / 2; + int pixY = rect().center().y() - bgImage.height() / 2; + QPoint point(pixX, pixY); + painter->drawImage(point, bgImage); + } + + painter->restore(); +} + +void VideoWidget::drawImg(QPainter *painter, QImage img) +{ + painter->save(); + + int offset = borderWidth * 1 + 0; + if (fillImage) { + QRect rect(offset / 2, offset / 2, width() - offset, height() - offset); + painter->drawImage(rect, img); + } else { + //按照比例自动居中绘制 + img = img.scaled(width() - offset, height() - offset, Qt::KeepAspectRatio); + int pixX = rect().center().x() - img.width() / 2; + int pixY = rect().center().y() - img.height() / 2; + QPoint point(pixX, pixY); + painter->drawImage(point, img); + } + + painter->restore(); +} + +void VideoWidget::drawOSD(QPainter *painter, + int osdFontSize, + const QString &osdText, + const QColor &osdColor, + const QImage &osdImage, + const VideoWidget::OSDFormat &osdFormat, + const VideoWidget::OSDPosition &osdPosition) +{ + painter->save(); + + //标签位置尽量偏移多一点避免遮挡 + QRect osdRect(rect().x() + (borderWidth * 2), rect().y() + (borderWidth * 2), width() - (borderWidth * 5), height() - (borderWidth * 5)); + int flag = Qt::AlignLeft | Qt::AlignTop; + QPoint point = QPoint(osdRect.x(), osdRect.y()); + + if (osdPosition == OSDPosition_Left_Top) { + flag = Qt::AlignLeft | Qt::AlignTop; + point = QPoint(osdRect.x(), osdRect.y()); + } else if (osdPosition == OSDPosition_Left_Bottom) { + flag = Qt::AlignLeft | Qt::AlignBottom; + point = QPoint(osdRect.x(), osdRect.height() - osdImage.height()); + } else if (osdPosition == OSDPosition_Right_Top) { + flag = Qt::AlignRight | Qt::AlignTop; + point = QPoint(osdRect.width() - osdImage.width(), osdRect.y()); + } else if (osdPosition == OSDPosition_Right_Bottom) { + flag = Qt::AlignRight | Qt::AlignBottom; + point = QPoint(osdRect.width() - osdImage.width(), osdRect.height() - osdImage.height()); + } + + if (osdFormat == OSDFormat_Image) { + painter->drawImage(point, osdImage); + } else { + QDateTime now = QDateTime::currentDateTime(); + QString text = osdText; + if (osdFormat == OSDFormat_Date) { + text = now.toString("yyyy-MM-dd"); + } else if (osdFormat == OSDFormat_Time) { + text = now.toString("HH:mm:ss"); + } else if (osdFormat == OSDFormat_DateTime) { + text = now.toString("yyyy-MM-dd HH:mm:ss"); + } + + //设置颜色及字号 + QFont font; + font.setPixelSize(osdFontSize); + painter->setPen(osdColor); + painter->setFont(font); + + painter->drawText(osdRect, flag, text); + } + + painter->restore(); +} + +QImage VideoWidget::getImage() const +{ + return this->image; +} + +QDateTime VideoWidget::getLastTime() const +{ + return QDateTime::currentDateTime(); +} + +QString VideoWidget::getUrl() const +{ + return this->property("url").toString(); +} + +bool VideoWidget::getCopyImage() const +{ + return this->copyImage; +} + +bool VideoWidget::getCheckLive() const +{ + return this->checkLive; +} + +bool VideoWidget::getDrawImage() const +{ + return this->drawImage; +} + +bool VideoWidget::getFillImage() const +{ + return this->fillImage; +} + +bool VideoWidget::getFlowEnable() const +{ + return this->flowEnable; +} + +QColor VideoWidget::getFlowBgColor() const +{ + return this->flowBgColor; +} + +QColor VideoWidget::getFlowPressColor() const +{ + return this->flowPressColor; +} + +int VideoWidget::getTimeout() const +{ + return this->timeout; +} + +int VideoWidget::getBorderWidth() const +{ + return this->borderWidth; +} + +QColor VideoWidget::getBorderColor() const +{ + return this->borderColor; +} + +QColor VideoWidget::getFocusColor() const +{ + return this->focusColor; +} + +QString VideoWidget::getBgText() const +{ + return this->bgText; +} + +QImage VideoWidget::getBgImage() const +{ + return this->bgImage; +} + +bool VideoWidget::getOSD1Visible() const +{ + return this->osd1Visible; +} + +int VideoWidget::getOSD1FontSize() const +{ + return this->osd1FontSize; +} + +QString VideoWidget::getOSD1Text() const +{ + return this->osd1Text; +} + +QColor VideoWidget::getOSD1Color() const +{ + return this->osd1Color; +} + +QImage VideoWidget::getOSD1Image() const +{ + return this->osd1Image; +} + +VideoWidget::OSDFormat VideoWidget::getOSD1Format() const +{ + return this->osd1Format; +} + +VideoWidget::OSDPosition VideoWidget::getOSD1Position() const +{ + return this->osd1Position; +} + +bool VideoWidget::getOSD2Visible() const +{ + return this->osd2Visible; +} + +int VideoWidget::getOSD2FontSize() const +{ + return this->osd2FontSize; +} + +QString VideoWidget::getOSD2Text() const +{ + return this->osd2Text; +} + +QColor VideoWidget::getOSD2Color() const +{ + return this->osd2Color; +} + +QImage VideoWidget::getOSD2Image() const +{ + return this->osd2Image; +} + +VideoWidget::OSDFormat VideoWidget::getOSD2Format() const +{ + return this->osd2Format; +} + +VideoWidget::OSDPosition VideoWidget::getOSD2Position() const +{ + return this->osd2Position; +} + +QSize VideoWidget::sizeHint() const +{ + return QSize(500, 350); +} + +QSize VideoWidget::minimumSizeHint() const +{ + return QSize(50, 35); +} + +void VideoWidget::initFlowStyle() +{ + //设置样式以便区分,可以自行更改样式,也可以不用样式 + QStringList qss; + QString rgba = QString("rgba(%1,%2,%3,150)").arg(flowBgColor.red()).arg(flowBgColor.green()).arg(flowBgColor.blue()); + qss.append(QString("#flowPanel{background:%1;border:none;}").arg(rgba)); + qss.append(QString("QPushButton{border:none;padding:0px;background:rgba(0,0,0,0);}")); + qss.append(QString("QPushButton:pressed{color:%1;}").arg(flowPressColor.name())); + flowPanel->setStyleSheet(qss.join("")); +} + +void VideoWidget::updateImage(const QImage &image) +{ + //拷贝图片有个好处,当处理器比较差的时候,图片不会产生断层,缺点是占用时间 + //默认QImage类型是浅拷贝,可能正在绘制的时候,那边已经更改了图片的上部分数据 + this->image = copyImage ? image.copy() : image; + this->update(); +} + +void VideoWidget::checkVideo() +{ + QDateTime now = QDateTime::currentDateTime(); + QDateTime lastTime = now; + int sec = lastTime.secsTo(now); + if (sec >= timeout) { + restart(); + } +} + +void VideoWidget::btnClicked() +{ + QPushButton *btn = (QPushButton *)sender(); + emit btnClicked(btn->objectName()); +} + +void VideoWidget::setInterval(int interval) +{ + +} + +void VideoWidget::setSleepTime(int sleepTime) +{ + +} + +void VideoWidget::setCheckTime(int checkTime) +{ + +} + +void VideoWidget::setCheckConn(bool checkConn) +{ + +} + +void VideoWidget::setUrl(const QString &url) +{ + this->setProperty("url", url); +} + +void VideoWidget::setHardware(const QString &hardware) +{ + +} + +void VideoWidget::setSaveFile(bool saveFile) +{ + +} + +void VideoWidget::setSaveInterval(int saveInterval) +{ + +} + +void VideoWidget::setSavePath(const QString &savePath) +{ + //如果目录不存在则新建 + QDir dir(savePath); + if (!dir.exists()) { + dir.mkdir(savePath); + } + + +} + +void VideoWidget::setFileName(const QString &fileName) +{ + +} + +void VideoWidget::setCopyImage(bool copyImage) +{ + this->copyImage = copyImage; +} + +void VideoWidget::setCheckLive(bool checkLive) +{ + this->checkLive = checkLive; +} + +void VideoWidget::setDrawImage(bool drawImage) +{ + this->drawImage = drawImage; +} + +void VideoWidget::setFillImage(bool fillImage) +{ + this->fillImage = fillImage; +} + +void VideoWidget::setFlowEnable(bool flowEnable) +{ + this->flowEnable = flowEnable; +} + +void VideoWidget::setFlowBgColor(const QColor &flowBgColor) +{ + if (this->flowBgColor != flowBgColor) { + this->flowBgColor = flowBgColor; + this->initFlowStyle(); + } +} + +void VideoWidget::setFlowPressColor(const QColor &flowPressColor) +{ + if (this->flowPressColor != flowPressColor) { + this->flowPressColor = flowPressColor; + this->initFlowStyle(); + } +} + +void VideoWidget::setTimeout(int timeout) +{ + this->timeout = timeout; +} + +void VideoWidget::setBorderWidth(int borderWidth) +{ + this->borderWidth = borderWidth; +} + +void VideoWidget::setBorderColor(const QColor &borderColor) +{ + this->borderColor = borderColor; +} + +void VideoWidget::setFocusColor(const QColor &focusColor) +{ + this->focusColor = focusColor; +} + +void VideoWidget::setBgText(const QString &bgText) +{ + this->bgText = bgText; +} + +void VideoWidget::setBgImage(const QImage &bgImage) +{ + this->bgImage = bgImage; +} + +void VideoWidget::setOSD1Visible(bool osdVisible) +{ + this->osd1Visible = osdVisible; +} + +void VideoWidget::setOSD1FontSize(int osdFontSize) +{ + this->osd1FontSize = osdFontSize; +} + +void VideoWidget::setOSD1Text(const QString &osdText) +{ + this->osd1Text = osdText; +} + +void VideoWidget::setOSD1Color(const QColor &osdColor) +{ + this->osd1Color = osdColor; +} + +void VideoWidget::setOSD1Image(const QImage &osdImage) +{ + this->osd1Image = osdImage; +} + +void VideoWidget::setOSD1Format(const VideoWidget::OSDFormat &osdFormat) +{ + this->osd1Format = osdFormat; +} + +void VideoWidget::setOSD1Position(const VideoWidget::OSDPosition &osdPosition) +{ + this->osd1Position = osdPosition; +} + +void VideoWidget::setOSD2Visible(bool osdVisible) +{ + this->osd2Visible = osdVisible; +} + +void VideoWidget::setOSD2FontSize(int osdFontSize) +{ + this->osd2FontSize = osdFontSize; +} + +void VideoWidget::setOSD2Text(const QString &osdText) +{ + this->osd2Text = osdText; +} + +void VideoWidget::setOSD2Color(const QColor &osdColor) +{ + this->osd2Color = osdColor; +} + +void VideoWidget::setOSD2Image(const QImage &osdImage) +{ + this->osd2Image = osdImage; +} + +void VideoWidget::setOSD2Format(const VideoWidget::OSDFormat &osdFormat) +{ + this->osd2Format = osdFormat; +} + +void VideoWidget::setOSD2Position(const VideoWidget::OSDPosition &osdPosition) +{ + this->osd2Position = osdPosition; +} + +void VideoWidget::open() +{ + //qDebug() << TIMEMS << "open video" << objectName(); + clear(); + + //如果是图片则只显示图片就行 + image = QImage(this->property("url").toString()); + if (!image.isNull()) { + this->update(); + return; + } + + + + if (checkLive) { + timerCheck->start(); + } +} + +void VideoWidget::pause() +{ + +} + +void VideoWidget::next() +{ + +} + +void VideoWidget::close() +{ + if (checkLive) { + timerCheck->stop(); + } + + QTimer::singleShot(1, this, SLOT(clear())); +} + +void VideoWidget::restart() +{ + //qDebug() << TIMEMS << "restart video" << objectName(); + close(); + QTimer::singleShot(10, this, SLOT(open())); +} + +void VideoWidget::clear() +{ + image = QImage(); + this->update(); +} + diff --git a/videowidget/videowidget.h b/videowidget/videowidget.h new file mode 100644 index 0000000..e7296dd --- /dev/null +++ b/videowidget/videowidget.h @@ -0,0 +1,314 @@ +#ifndef VIDEOWIDGET_H +#define VIDEOWIDGET_H + +/** + * 通用视频播放控件 作者:feiyangqingyun(QQ:517216493) 2018-5-1 + * 1:可设置边框大小 + * 2:可设置边框颜色 + * 3:可设置两路OSD标签 + * 4:可设置是否绘制OSD标签 + * 5:可设置标签文本或图片 + * 6:可设置OSD位置 左上角+左下角+右上角+右下角 + * 7:可设置OSD风格 文本+日期+时间+日期时间+图片 + * 8:自定义半透明悬浮窗体,一排按钮 + * 9:悬浮按钮可自定义设置,包括背景颜色+按下颜色 + * 10:发送信号通知单击了哪个悬浮按钮 + * 11:能够识别拖进来的文件,通知url + * 12:提供open close pause等接口 + */ + +#include +#include + +class QTimer; + +#ifdef quc +#if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) +#include +#else +#include +#endif + +class QDESIGNER_WIDGET_EXPORT VideoWidget : public QWidget +#else +class VideoWidget : public QWidget +#endif + +{ + Q_OBJECT + Q_ENUMS(OSDFormat) + Q_ENUMS(OSDPosition) + + Q_PROPERTY(bool copyImage READ getCopyImage WRITE setCopyImage) + Q_PROPERTY(bool checkLive READ getCheckLive WRITE setCheckLive) + Q_PROPERTY(bool drawImage READ getDrawImage WRITE setDrawImage) + Q_PROPERTY(bool fillImage READ getFillImage WRITE setFillImage) + + Q_PROPERTY(bool flowEnable READ getFlowEnable WRITE setFlowEnable) + Q_PROPERTY(QColor flowBgColor READ getFlowBgColor WRITE setFlowBgColor) + Q_PROPERTY(QColor flowPressColor READ getFlowPressColor WRITE setFlowPressColor) + + Q_PROPERTY(int timeout READ getTimeout WRITE setTimeout) + Q_PROPERTY(int borderWidth READ getBorderWidth WRITE setBorderWidth) + Q_PROPERTY(QColor borderColor READ getBorderColor WRITE setBorderColor) + Q_PROPERTY(QColor focusColor READ getFocusColor WRITE setFocusColor) + Q_PROPERTY(QString bgText READ getBgText WRITE setBgText) + Q_PROPERTY(QImage bgImage READ getBgImage WRITE setBgImage) + + Q_PROPERTY(bool osd1Visible READ getOSD1Visible WRITE setOSD1Visible) + Q_PROPERTY(int osd1FontSize READ getOSD1FontSize WRITE setOSD1FontSize) + Q_PROPERTY(QString osd1Text READ getOSD1Text WRITE setOSD1Text) + Q_PROPERTY(QColor osd1Color READ getOSD1Color WRITE setOSD1Color) + Q_PROPERTY(QImage osd1Image READ getOSD1Image WRITE setOSD1Image) + Q_PROPERTY(OSDFormat osd1Format READ getOSD1Format WRITE setOSD1Format) + Q_PROPERTY(OSDPosition osd1Position READ getOSD1Position WRITE setOSD1Position) + + Q_PROPERTY(bool osd2Visible READ getOSD2Visible WRITE setOSD2Visible) + Q_PROPERTY(int osd2FontSize READ getOSD2FontSize WRITE setOSD2FontSize) + Q_PROPERTY(QString osd2Text READ getOSD2Text WRITE setOSD2Text) + Q_PROPERTY(QColor osd2Color READ getOSD2Color WRITE setOSD2Color) + Q_PROPERTY(QImage osd2Image READ getOSD2Image WRITE setOSD2Image) + Q_PROPERTY(OSDFormat osd2Format READ getOSD2Format WRITE setOSD2Format) + Q_PROPERTY(OSDPosition osd2Position READ getOSD2Position WRITE setOSD2Position) + +public: + //标签格式 + enum OSDFormat { + OSDFormat_Text = 0, //文本 + OSDFormat_Date = 1, //日期 + OSDFormat_Time = 2, //时间 + OSDFormat_DateTime = 3, //日期时间 + OSDFormat_Image = 4 //图片 + }; + + //标签位置 + enum OSDPosition { + OSDPosition_Left_Top = 0, //左上角 + OSDPosition_Left_Bottom = 1, //左下角 + OSDPosition_Right_Top = 2, //右上角 + OSDPosition_Right_Bottom = 3 //右下角 + }; + + explicit VideoWidget(QWidget *parent = 0); + ~VideoWidget(); + +protected: + void resizeEvent(QResizeEvent *); + void enterEvent(QEvent *); + void leaveEvent(QEvent *); + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void paintEvent(QPaintEvent *); + void drawBorder(QPainter *painter); + void drawBg(QPainter *painter); + void drawImg(QPainter *painter, QImage img); + void drawOSD(QPainter *painter, + int osdFontSize, + const QString &osdText, + const QColor &osdColor, + const QImage &osdImage, + const OSDFormat &osdFormat, + const OSDPosition &osdPosition); + +private: + QTimer *timerCheck; //定时器检查设备是否在线 + QImage image; //要显示的图片 + QWidget *flowPanel; //悬浮条面板 + + bool copyImage; //是否拷贝图片 + bool checkLive; //检测是否活着 + bool drawImage; //是否绘制图片 + bool fillImage; //自动拉伸填充 + + bool flowEnable; //是否显示悬浮条 + QColor flowBgColor; //悬浮条背景颜色 + QColor flowPressColor; //悬浮条按下颜色 + + int timeout; //超时时间 + int borderWidth; //边框宽度 + QColor borderColor; //边框颜色 + QColor focusColor; //有焦点边框颜色 + QString bgText; //默认无图像显示文字 + QImage bgImage; //默认无图像背景图片 + + bool osd1Visible; //显示标签1 + int osd1FontSize; //标签1字号 + QString osd1Text; //标签1文本 + QColor osd1Color; //标签1颜色 + QImage osd1Image; //标签1图片 + OSDFormat osd1Format; //标签1文本格式 + OSDPosition osd1Position; //标签1位置 + + bool osd2Visible; //显示标签2 + int osd2FontSize; //标签2字号 + QString osd2Text; //标签2文本 + QColor osd2Color; //标签2颜色 + QImage osd2Image; //标签2图片 + OSDFormat osd2Format; //标签2文本格式 + OSDPosition osd2Position; //标签2位置 + +public: + QImage getImage() const; + QDateTime getLastTime() const; + QString getUrl() const; + + bool getCopyImage() const; + bool getCheckLive() const; + bool getDrawImage() const; + bool getFillImage() const; + + bool getFlowEnable() const; + QColor getFlowBgColor() const; + QColor getFlowPressColor() const; + + int getTimeout() const; + int getBorderWidth() const; + QColor getBorderColor() const; + QColor getFocusColor() const; + QString getBgText() const; + QImage getBgImage() const; + + bool getOSD1Visible() const; + int getOSD1FontSize() const; + QString getOSD1Text() const; + QColor getOSD1Color() const; + QImage getOSD1Image() const; + OSDFormat getOSD1Format() const; + OSDPosition getOSD1Position() const; + + bool getOSD2Visible() const; + int getOSD2FontSize() const; + QString getOSD2Text() const; + QColor getOSD2Color() const; + QImage getOSD2Image() const; + OSDFormat getOSD2Format() const; + OSDPosition getOSD2Position() const; + + QSize sizeHint() const; + QSize minimumSizeHint() const; + +private slots: + //初始化悬浮条样式 + void initFlowStyle(); + //接收图像并绘制 + void updateImage(const QImage &image); + //校验设备 + void checkVideo(); + //处理按钮单击 + void btnClicked(); + +signals: + //播放成功 + void receivePlayOk(); + //播放失败 + void receivePlayError(); + //播放结束 + void receivePlayFinsh(); + + //收到图片信号 + void receiveImage(const QImage &image); + + //接收到拖曳文件 + void fileDrag(const QString &url); + + //工具栏单击 + void btnClicked(const QString &objName); + +public slots: + //设置显示间隔 + void setInterval(int interval); + //设置休眠时间 + void setSleepTime(int sleepTime); + //设置检测连接超时 + void setCheckTime(int checkTime); + //设置是否检测连接 + void setCheckConn(bool checkConn); + //设置视频流地址 + void setUrl(const QString &url); + //设置硬件解码器名称 + void setHardware(const QString &hardware); + + //设置是否保存文件 + void setSaveFile(bool saveFile); + //设置保存间隔 + void setSaveInterval(int saveInterval); + //设置保存文件夹 + void setSavePath(const QString &savePath); + //设置保存文件名称 + void setFileName(const QString &fileName); + + //设置是否拷贝图片 + void setCopyImage(bool copyImage); + //设置是否检测活着 + void setCheckLive(bool checkLive); + //设置是否实时绘制图片 + void setDrawImage(bool drawImage); + //设置是否拉伸填充 + void setFillImage(bool fillImage); + + //设置是否启用悬浮条 + void setFlowEnable(bool flowEnable); + //设置悬浮条背景颜色 + void setFlowBgColor(const QColor &flowBgColor); + //设置悬浮条按下颜色 + void setFlowPressColor(const QColor &flowPressColor); + + //设置超时时间 + void setTimeout(int timeout); + //设置边框宽度 + void setBorderWidth(int borderWidth); + //设置边框颜色 + void setBorderColor(const QColor &borderColor); + //设置有焦点边框颜色 + void setFocusColor(const QColor &focusColor); + //设置无图像文字 + void setBgText(const QString &bgText); + //设置无图像背景图 + void setBgImage(const QImage &bgImage); + + //设置标签1是否可见 + void setOSD1Visible(bool osdVisible); + //设置标签1文字字号 + void setOSD1FontSize(int osdFontSize); + //设置标签1文本 + void setOSD1Text(const QString &osdText); + //设置标签1文字颜色 + void setOSD1Color(const QColor &osdColor); + //设置标签1图片 + void setOSD1Image(const QImage &osdImage); + //设置标签1格式 + void setOSD1Format(const OSDFormat &osdFormat); + //设置标签1位置 + void setOSD1Position(const OSDPosition &osdPosition); + + //设置标签2是否可见 + void setOSD2Visible(bool osdVisible); + //设置标签2文字字号 + void setOSD2FontSize(int osdFontSize); + //设置标签2文本 + void setOSD2Text(const QString &osdText); + //设置标签2文字颜色 + void setOSD2Color(const QColor &osdColor); + //设置标签2图片 + void setOSD2Image(const QImage &osdImage); + //设置标签2格式 + void setOSD2Format(const OSDFormat &osdFormat); + //设置标签2位置 + void setOSD2Position(const OSDPosition &osdPosition); + + //打开设备 + void open(); + //暂停 + void pause(); + //继续 + void next(); + //关闭设备 + void close(); + //重新加载 + void restart(); + //清空 + void clear(); + +}; + +#endif // VIDEOWIDGET_H diff --git a/videowidget/videowidget.pro b/videowidget/videowidget.pro new file mode 100644 index 0000000..832e77b --- /dev/null +++ b/videowidget/videowidget.pro @@ -0,0 +1,23 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2017-01-05T22:11:54 +# +#------------------------------------------------- + +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = videowidget +TEMPLATE = app +DESTDIR = $$PWD/../bin +CONFIG += warn_off + +SOURCES += main.cpp +SOURCES += frmvideowidget.cpp +SOURCES += videowidget.cpp + +HEADERS += frmvideowidget.h +HEADERS += videowidget.h + +FORMS += frmvideowidget.ui