一、作品说明
在视频监控系统中,往往会涉及到视频录像或者特定事件录像的情况,由此需要选取合适的时间范围,要求能够灵活、多段选取,并且时间精确到分钟,可以实现直观显示、删除和保存时间等多种功能。纯Qt编写,源码可使用QtCreator直接编译使用,也可以在此基础上做二次开发,持续更新完善升级维护,欢迎各位交流讨论。
备注:开发版本为Qt5.1.0-msvc2012-x64-opengl
二、控件功能
1.纯Qt编写,支持跨平台编译
2.支持鼠标拖动选取时间
3.支持时间标签移动
4.支持显示标签时间范围
5.支持改变标签颜色
6.支持获取所有标签时间值
7.支持标签删除
8.支持多种标签颜色
9.支持标签伸缩改变时间范围
10.支持QtCreatror编译成插件,在QtDesigner中使用
三、作品展示
时间录像控件
四、核心代码
/*
**功能:事件过滤器
**参数:object,转换为时间标签对象
**参数:event,事件
**返回值:布尔值
*/
bool QtzEventTime::eventFilter(QObject *object, QEvent *event)
{
QtzLabel* timeLabel=(QtzLabel*)object;
QMouseEvent *mouseEvent=static_cast<QMouseEvent*>(event);
if(mouseEvent->type() == QEvent::MouseButtonPress)
{
/*鼠标按下,隐藏时间提示*/
d->timeTip->hide();
d->pressTip->hide();
/*获取时间段内容*/
QString startContent=getHourAndMinute(timeLabel->x());
QString endContent=getHourAndMinute(timeLabel->x()+timeLabel->rect().width());
QString content=QString("%1:%2").arg(startContent).arg(endContent);
Q_EMIT sendContent(content);
/*计算标签提示的新坐标*/
int x=timeLabel->x()+(timeLabel->rect().width())/2-d->pressTip->size().width()/2;
int y=timeLabel->y()-d->pressTip->size().height();
d->pressTip->move(mapToGlobal(QPoint(x,y)));
d->pressTip->show();
QString propertyName=timeLabel->objectName();
if (propertyName == QStringLiteral("定时"))
{
d->typeValue=propertyName;
}
else if (propertyName == QStringLiteral("报警"))
{
d->typeValue=propertyName;
}
else if (propertyName == QStringLiteral("动测或报警"))
{
d->typeValue=propertyName;
}
else if (propertyName == QStringLiteral("事件"))
{
d->typeValue=propertyName;
}
Q_EMIT sendType(d->typeValue);
Q_EMIT hideAll();
d->delLabel=timeLabel;
if(mouseEvent->button()==Qt::LeftButton)
{
d->lastPos = mouseEvent->pos();
if(timeLabel->rect().contains(mouseEvent->pos()))
{
d->isPressed = true;
/*鼠标按下,同时检测选中标签周围的标签索引,鼠标移动过程中不检测*/
findNearestLabel(timeLabel,QPoint());
if(d->frontLabel!=timeLabel)
{
if(d->frontLabel!=nullptr)
{
/*将前一个时间标签的锚点区域擦掉*/
connect(this,SIGNAL(drawAnchor(bool)),d->frontLabel,SLOT(drawAnchor(bool)));
Q_EMIT drawAnchor(false);
/*绘制完释放信号连接*/
disconnect(this,SIGNAL(drawAnchor(bool)),d->frontLabel,SLOT(drawAnchor(bool)));
}
/*记录当前时间区域标签*/
d->frontLabel = timeLabel;
/*鼠标按下开始绘制当前时间区域锚点区域*/
connect(this,SIGNAL(drawAnchor(bool)),timeLabel,SLOT(drawAnchor(bool)));
/*是否绘制锚点区域*/
Q_EMIT drawAnchor(true);
/*绘制完释放信号连接*/
disconnect(this,SIGNAL(drawAnchor(bool)),timeLabel,SLOT(drawAnchor(bool)));
/*恢复初值*/
d->frontLabel = nullptr;
}
}
}
}
else if(mouseEvent->type() == QEvent::MouseMove && d->isPressed)
{
/*设置移动最小坐标范围*/
int minX = linearToPaint(0);
/*设置移动最大坐标范围*/
int maxX = linearToPaint(24);
/*计算坐标偏移值*/
int offX = mouseEvent->pos().x() - d->lastPos.x();
/*生成新的横纵坐标*/
int x = timeLabel->x()+offX;
int y = timeLabel->y();
/*碰撞检测,通过offX确定移动的方向,左或者右*/
bool result=collisionDetection(x,timeLabel,offX);
/*使用move函数移动标签区域*/
if(x>=minX && x<=maxX-timeLabel->rect().width() && result)
{
if(!d->isStretchMove)
timeLabel->move(x,y);
}
d->pressTip->hide();
/*计算标签提示的新坐标*/
int sx=timeLabel->x()-d->startTip->size().width()/2;
int sy=timeLabel->y()-d->startTip->size().height();
d->startTip->move(mapToGlobal(QPoint(sx,sy)));
/*获取时间段内容*/
QString startContent=getHourAndMinute(timeLabel->x());
d->startTip->setContent(startContent);
/*鼠标进入标签范围,显示时间提示*/
d->startTip->show();
/*计算标签提示的新坐标*/
int ex=timeLabel->x()+timeLabel->rect().width()-d->endTip->size().width()/2;
int ey=timeLabel->y()-d->endTip->size().height();
d->endTip->move(mapToGlobal(QPoint(ex,ey)));
/*获取时间段内容*/
QString endContent=getHourAndMinute(timeLabel->x()+timeLabel->rect().width());
d->endTip->setContent(endContent);
/*鼠标进入标签范围,显示时间提示*/
d->endTip->show();
}
else if (mouseEvent->type() == QEvent::MouseButtonRelease && d->isPressed)
{
d->isPressed = false;
/*鼠标释放,同时清理连表索引内容*/
if(!d->labelIndex.isEmpty())
d->labelIndex.clear();
/*鼠标释放,隐藏时间提示*/
d->startTip->hide();
d->endTip->hide();
}
else if (mouseEvent->type() == QEvent::Enter)
{
/*计算标签提示的新坐标*/
int x=timeLabel->x()+(timeLabel->rect().width())/2-d->timeTip->size().width()/2;
int y=timeLabel->y()-d->timeTip->size().height();
d->timeTip->move(mapToGlobal(QPoint(x,y)));
/*获取时间段内容*/
QString startContent=getHourAndMinute(timeLabel->x());
QString endContent=getHourAndMinute(timeLabel->x()+timeLabel->rect().width());
QString content=QString("%1-%2").arg(startContent).arg(endContent);
QString type=timeLabel->objectName();
d->timeTip->setContent(QString("%1\n%2").arg(type).arg(content));
/*鼠标进入标签范围,显示时间提示*/
d->timeTip->show();
}
else if(mouseEvent->type() == QEvent::Leave)
{
/*鼠标离开标签范围,隐藏时间提示*/
d->timeTip->hide();
}
return QWidget::eventFilter(object, event);
}