目录





本次的Qt项目-安防监控系统,由于工程量较大,分成四篇文章呈现源码。
如果想学习这个安防监控系统项目,另外三篇文章源码可自行查看
Sqlite数据库和FFMPEG开源库,上传至资源,可自行领取学习,对于环境的搭建,可以参考以下文章
对摄像头类不知如何获取的,可以参照以下这篇文章解决疑惑
- #ifndef SETWIDGET_H
- #define SETWIDGET_H
-
- #include<QDebug>//测试
- #include <QWidget>//窗口
- #include <QLabel>//文本
- #include <QPushButton>//按钮
- #include <QLineEdit>//编辑框
- #include <QButtonGroup>//按钮
- #include <QComboBox>//下拉框
- #include <QCheckBox>//检测
- #include <QIcon>//嵌入图
- #include <QMessageBox>//消息框
- #include <QKeyEvent>//按键事件
- #include <QCameraInfo>//获取摄像头信息
- #include <QFileDialog>//文件框
- #include "decode.h"//解码
- #include "setcontrol.h"//设置控制层
-
- class SetWidget : public QWidget
- {
- Q_OBJECT
- public:
- // explicit SetWidget(QWidget *parent = 0);
- SetWidget();//构造函数
- void init_UI();//UI窗口
- void init_control();//控件布局
- void init_connect();//按钮-信号槽机制
- int mark;//标志位--有无数据
- private:
- QLabel *Set_label,*VideoPath_label,*ImagePath_label,*Interval_label,*Camera_label;//标签文本
- QPushButton *VideoPath_btn,*ImagePath_btn,*OK_btn,*Esc_btn;//按钮控件
- QLineEdit *VideoPath_edit,*ImagePath_edit;//编辑框
- QComboBox *Interval_box,*Camera_box;//下拉框
- QLabel *setwidget_label,*setwidget_label1;//设置界面文本
-
- signals:
- void tomain();
-
- public slots:
- void Select_VideoPath();//视频路径选择窗口函数
- void Select_ImagePath();//图片路径选择窗口函数
- void init_data();//设置信息存储函数
- void getmain();//跳转到主界面函数
- };
-
- #endif // SETWIDGET_H
- #include "setwidget.h"
- #include"main_widget.h"
-
- //SetWidget::SetWidget(QWidget *parent) : QWidget(parent)
- //{
- //}
-
- //构造函数
- SetWidget::SetWidget()
- {
- this->mark=0;//标志位
- init_UI();//UI窗口
- init_control();//控件布局设计
- init_connect();//按钮-信号槽机制
- }
-
- //UI窗口
- void SetWidget::init_UI()
- {
- //设置窗口标题
- this->setWindowTitle("安防监控系统");
- //设置窗口大小
- this->setFixedSize(800,600);
- setWindowFlags(Qt::FramelessWindowHint);//无边框
- //自己设置背景图片
- QPixmap pixmap(":/image/060902.jpg");
- QPalette palette;
- palette.setBrush(backgroundRole(), QBrush(pixmap));
- setPalette(palette);
- }
-
- //设置窗口控件布局函数
- void SetWidget::init_control()
- {
- //字体大小--ft1 标题字体大小 ft2 标签字体大小
- QFont ft1,ft2;
- ft1.setPointSize(30);
- ft2.setPointSize(12);
- //文本
- this->Set_label = new QLabel("设置界面",this);
- this->Set_label->setGeometry(300,280,260,40);
- this->Set_label->setFont(ft1);
- this->VideoPath_label = new QLabel("视频存储位置",this);
- this->VideoPath_label->setGeometry(190,350,120,30);
- this->VideoPath_label->setFont(ft2);
- this->ImagePath_label = new QLabel("图片存储位置",this);
- this->ImagePath_label->setGeometry(190,400,120,30);
- this->ImagePath_label->setFont(ft2);
- this->Interval_label = new QLabel("采集时间间隔",this);
- this->Interval_label->setGeometry(190,450,120,30);
- this->Interval_label->setFont(ft2);
- this->Camera_label = new QLabel("摄像头配置",this);
- this->Camera_label->setGeometry(190,500,120,30);
- this->Camera_label->setFont(ft2);
- this->setwidget_label = new QLabel(this);
- this->setwidget_label->setGeometry(0,0,400,270);
- this->setwidget_label->setPixmap(QPixmap(":/image/061002.jpg").scaled(setwidget_label->size()));
- this->setwidget_label1 = new QLabel(this);
- this->setwidget_label1->setGeometry(400,0,400,270);
- this->setwidget_label1->setPixmap(QPixmap(":/image/061001.jpg").scaled(setwidget_label1->size()));
- //编辑框
- this->VideoPath_edit = new QLineEdit(this);
- this->VideoPath_edit->setReadOnly(true);
- this->VideoPath_edit->setGeometry(320,350,200,30);
- this->ImagePath_edit = new QLineEdit(this);
- this->ImagePath_edit->setReadOnly(true);
- this->ImagePath_edit->setGeometry(320,400,200,30);
- //按钮
- this->VideoPath_btn = new QPushButton("...",this);
- this->VideoPath_btn->setGeometry(530,350,30,30);
- this->ImagePath_btn = new QPushButton("...",this);
- this->ImagePath_btn->setGeometry(530,400,30,30);
- this->OK_btn = new QPushButton("确定",this);
- this->OK_btn->setGeometry(320,550,60,30);
- OK_btn->setFont(ft2);
- this->Esc_btn = new QPushButton("取消",this);
- this->Esc_btn->setGeometry(440,550,60,30);
- Esc_btn->setFont(ft2);
- //录制时长下拉框控件初始化
- this->Interval_box = new QComboBox(this);
- this->Interval_box->setGeometry(320,450,200,30);
- this->Interval_box->addItem("1分钟");
- this->Interval_box->addItem("2分钟");
- this->Interval_box->addItem("3分钟");
- this->Interval_box->setFont(ft2);
- //摄像头下拉框控件初始化
- this->Camera_box = new QComboBox(this);
- this->Camera_box->setGeometry(320,500,200,30);
- this->Camera_box->setFont(ft2);
- //获取摄像头
- QList<QString> cnames= Decode::getcamera();
- this->Camera_box->addItems(cnames);
- }
-
- //按钮-信号槽机制
- void SetWidget::init_connect()
- {
- //选择视频路径
- connect(this->VideoPath_btn,SIGNAL(clicked()),this,SLOT(Select_VideoPath()));
- //选择图片路径
- connect(this->ImagePath_btn,SIGNAL(clicked()),this,SLOT(Select_ImagePath()));
- //确定--设置信息存储
- connect(this->OK_btn,SIGNAL(clicked()),this,SLOT(init_data()));
- //确定--跳转到主界面
- connect(this->OK_btn,SIGNAL(clicked()),this,SLOT(getmain()));
- //关闭按钮关闭窗口
- connect(this->Esc_btn,SIGNAL(clicked(bool)),this,SLOT(close()));
- }
-
- //设置信息存储函数
- void SetWidget::init_data()
- {
- //framecount时长换算,60分钟=1000毫秒
- int framecount = 0;
- if(Interval_box->currentIndex() == 0)
- {
- framecount =1500;
- }
- if(Interval_box->currentIndex() == 1)
- {
- framecount =3000;
- }
- if(Interval_box->currentIndex() == 2)
- {
- framecount =4500;
- }
- //如果路径不为空
- if(VideoPath_edit->text().trimmed() != tr("") && ImagePath_edit->text().trimmed() != tr(""))
- {
- //先判断数据库里面是否有设置信息 mark 0为没有数据,1为有数据
- this->mark=SetControl::getInstance()->getSetting();
- int res;
- //如果没有设置信息,就存入数据库设置信息
- if(mark==0)
- {
- res=SetControl::getInstance()->doSet(this->VideoPath_edit->text().trimmed(),this->ImagePath_edit->text().trimmed(),
- framecount,Camera_box->currentText());
- }
- //如果有设置信息,就更新数据库设置信息
- else
- {
- res=SetControl::getInstance()->updateSetting(this->VideoPath_edit->text().trimmed(),this->ImagePath_edit->text().trimmed(),
- framecount,Camera_box->currentText());
- }
- //存入数据库信息 0表示成功,1表示失败
- if(res==0)
- {
- QMessageBox:: information(this,"提示","设置成功","确定");
- emit tomain();
- }
- else
- {
- QMessageBox:: information(this,"提示","设置失败","确定");
- }
- }
- //路径为空就提示
- else
- {
- QMessageBox:: information(this,"提示","路径不能为空","确定");
- }
- }
-
- //跳转到主界面函数
- void SetWidget::getmain()
- {
- //如果mark标志位为0为有数据,就不用设置就可以跳转到主界面
- if(mark==0)
- {
- this->close();
- Main_Widget *mainwidget = new Main_Widget();
- mainwidget->show();
- }
- else
- {
- this->close();
- Main_Widget *mainwidget = new Main_Widget();
- mainwidget->show();
- }
- }
-
- //视频路径选择窗口函数
- void SetWidget::Select_VideoPath()
- {
- QString Video_path=QFileDialog::getExistingDirectory(this,"选择视频存储路径","../");
- if(Video_path != nullptr)
- {
- //显示到编辑框上
- this->VideoPath_edit->setText(Video_path);
- }
- }
-
- //图片路径选择窗口函数
- void SetWidget::Select_ImagePath()
- {
- QString Image_path=QFileDialog::getExistingDirectory(this,"选择视频存储路径","../");
- if(Image_path != nullptr)
- {
- //显示到编辑框上
- this->ImagePath_edit->setText(Image_path);
- }
- }
- #ifndef MAIN_WIDGET_H
- #define MAIN_WIDGET_H
-
- #include <QWidget>
- #include <QLabel>//文本
- #include <QPushButton>//按钮
- #include <QLineEdit>//编辑框
- #include <QListWidget>//列表
- #include <QListWidgetItem>//列表项
- #include <QHBoxLayout>//水平
- #include <QVBoxLayout>//垂直
- #include <QIcon>//嵌入图
- #include <QPaintEvent>//绘制
- #include<QDebug>//调试
- #include<QList>//链表
- #include<QComboBox>//下拉框
- #include<QImage>//图像
- #include<QPixmap>//嵌入图
- #include<QStackedWidget>//栈窗口
- #include<QTimer>//定时器
- #include <QDateTime>//日期
- #include "main_monitorwidget.h"//监控窗口
- #include "main_replaywidget.h"//回放窗口
- #include "loginwidget.h"//登录窗口
- #include "setwidget.h"//设置窗口
-
- class Main_Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Main_Widget(QWidget *parent = nullptr);//构造函数
- void init_UI();//UI窗口
- void init_control();//控件布局
- void init_connect();//按钮-信号槽机制
- static int status;//状态
- private:
- QWidget *topWidget;//窗口布局
- QStackedWidget *bottomWidget;//栈窗口
- QLabel *time_label,*logo_label;//文本
- QVBoxLayout *totalLayout;//垂直布局
- QHBoxLayout *topLayout;//水平布局
- QPushButton *play_btn,*replay_btn,*log_btn,*setting_btn;//按钮
- QTimer *timer;//定时器
- Main_MonitorWidget *monitor;//监控窗口
- Main_ReplayWidget *replay;//回放窗口
- SetWidget *setting;
- loginWidget *loginwidget;
- signals:
-
- public slots:
- void qtimeSlot();//获取当前时间函数
- void Tosetting();//跳转到设置窗口函数
- void Toreplay();//跳转到回放模式函数
- void Tomonitor();//跳转到监控模式函数
- void Tomain();//关闭设置窗口函数
- };
-
- #endif // MAIN_WIDGET_H
- #include "main_widget.h"
-
- int Main_Widget::status=0;//主窗口初始状态
-
- //主界面构造函数
- Main_Widget::Main_Widget(QWidget *parent) : QWidget(parent)
- {
- init_UI();
- init_control();
- init_connect();
- }
-
- //主界面窗口设置
- void Main_Widget::init_UI()
- {
- this->setWindowTitle("陈茹涵--保安大队");
- this->setFixedSize(1400,900);
- this->totalLayout = new QVBoxLayout();
- // setWindowFlags(Qt::FramelessWindowHint);//无边框
- // setAttribute(Qt::WA_TranslucentBackground);//背景透明
- }
-
- //主界面控件布局设计
- void Main_Widget::init_control()
- {
- //上布局
- this->topLayout = new QHBoxLayout();
- this->topWidget = new QWidget(this);
- this->topWidget->setStyleSheet("background-color: rgb(252,157,154)");
- //下布局
- this->bottomWidget = new QStackedWidget(this);
- this->bottomWidget->setStyleSheet("background:white");
- //按钮
- this->play_btn = new QPushButton("监控模式",this);
- this->play_btn->setFixedSize(100,60);
- this->replay_btn = new QPushButton("回放模式",this);
- this->replay_btn->setFixedSize(100,60);
- this->log_btn = new QPushButton("日志查询",this);
- this->log_btn->setFixedSize(100,60);
- this->setting_btn = new QPushButton("系统设置",this);
- this->setting_btn->setFixedSize(100,60);
- //定时器--刷新时间
- this->time_label =new QLabel(this);
- this->timer = new QTimer(this);
- timer->start(500);
- //new一个监控模式布局
- this->monitor = new Main_MonitorWidget();
- //开始解码显示监控画面
- monitor->startdecode();
- //将监控模式布局放到堆栈布局里面
- this->bottomWidget->addWidget(monitor);
- //new一个回放模式布局
- this->replay = new Main_ReplayWidget();
- //将回放模式布局放到堆栈布局里面
- this->bottomWidget->addWidget(replay);
- //设置当前布局为监控模式
- this->bottomWidget->setCurrentWidget(monitor);
- //顶部导航栏布局
- this->topLayout->addStretch(0);//弹簧
- this->topLayout->setSpacing(18);//各个控件之间上下间距
- this->topLayout->addWidget(this->play_btn);
- this->topLayout->addWidget(this->replay_btn);
- this->topLayout->addWidget(this->log_btn);
- this->topLayout->addWidget(this->setting_btn);
- this->topLayout->addWidget(this->time_label);
- this->topWidget->setLayout(topLayout);//顶部布局设置
-
- this->totalLayout->addWidget(topWidget,1);//比例设计
- this->totalLayout->addWidget(bottomWidget,9);//比例设计
- this->setLayout(totalLayout);
- }
-
- //连接函数--按钮信号槽函数
- void Main_Widget::init_connect()
- {
- //获取当前时间
- connect(timer, SIGNAL(timeout()), this, SLOT(qtimeSlot()));
- //跳转到设置窗
- connect(setting_btn, SIGNAL(clicked()), this, SLOT(Tosetting()));
- //跳转到回放窗
- connect(replay_btn, SIGNAL(clicked()), this, SLOT(Toreplay()));
- //跳转到监控窗
- connect(play_btn, SIGNAL(clicked()), this, SLOT(Tomonitor()));
- }
-
- //获取当前时间函数
- void Main_Widget::qtimeSlot()
- {
- QDateTime date_time =QDateTime::currentDateTime();
- QString current_date =date_time.toString(" yyyy.MM.dd \nhh:mm:ss ddd");
- this->time_label->setText (current_date);
- }
-
- //跳转到设置窗口函数
- void Main_Widget::Tosetting()
- {
- //如果没有登录过就显示登录窗口-登录成功栈窗到相应界面
- if(this->status==0)
- {
- //登录成功状态为1
- this->loginwidget = new loginWidget;
- this->loginwidget->show();
- }
- else
- {
- this->setting = new SetWidget();
- this->setting->show();
- }
- }
-
- //跳转到回放模式函数
- void Main_Widget::Toreplay()
- {
- //如果没有登录过显示登录窗口
- if(this->status==0)
- {
- //登录成功状态为1
- this->loginwidget = new loginWidget;
- this->loginwidget->show();
- }
- else
- {
- this->replay->videolist();
- this->replay->init_connect();
- this->bottomWidget->setCurrentWidget(replay);
- }
- }
-
- //跳转到监控模式函数
- void Main_Widget::Tomonitor()
- {
- //如果没有登录过显示登录窗口
- if(this->status==0)
- {
- //登录成功状态为1
- this->loginwidget = new loginWidget;
- this->loginwidget->show();
- }
- else
- {
- this->bottomWidget->setCurrentWidget(monitor);
- }
- }
-
- //关闭设置窗口函数
- void Main_Widget::Tomain()
- {
- this->setting->close();
- }
- #ifndef MAIN_MONITORWIDGET_H
- #define MAIN_MONITORWIDGET_H
-
- #include <QWidget>
- #include <QLabel>//标签
- #include <QPushButton>//按钮
- #include <QHBoxLayout>//水平布局
- #include <QVBoxLayout>//垂直布局
- #include<QGridLayout>//网格布局-实现监控器田字布局
- #include <QPaintEvent>//重绘事件
- #include<QList>//链表
- #include<QImage>//图像
- #include<QPixmap>//嵌入图
- #include "decode.h"//解码
- #include<QListWidgetItem>//窗口图元项
-
- class Main_MonitorWidget : public QWidget
- {
- Q_OBJECT
- public:
- // explicit Main_MonitorWidget(QWidget *parent = 0);
- explicit Main_MonitorWidget(QWidget *parent = nullptr);
- void init_control();//控件布局设置1
- void init_control2();//控件布局设置2
- void init_connect();//按钮-信号槽机制
- void startdecode();//解码操作
- Decode *decodeThread;//声明解码线程
- private:
- QWidget *rightWidget,*leftWidget,*rightBottomWidget,*righttopWidget;//窗口布局设计
- QVBoxLayout *leftLayout,*rightLayout;//垂直布局设计
- QHBoxLayout *rightBottomLayout,*totalLayout;//水平布局设计
- QGridLayout *righttopLayout;//布局比例设计
- QPushButton *single_screen_btn,*multi_screen_btn;//按钮
- QLabel *video1_label,*video2_label,*video3_label,*video4_label;//标签文本
- QList <QString> camera;//摄像头
- QImage image;//图片
- protected:
- void paintEvent(QPaintEvent *);//重绘事件-接收图片监控显示
-
- signals:
-
- public slots:
- void receiveImg(QImage img);//接收图片函数
- void ToSingle();//切换单画面模式
- void ToFour();//切换多画面模式
- };
-
- #endif // MAIN_MONITORWIDGET_H
- #include "main_monitorwidget.h"
-
- //构造
- Main_MonitorWidget::Main_MonitorWidget(QWidget *parent) : QWidget(parent)
- {
- setWindowFlags(Qt::FramelessWindowHint); //无边框
- setAttribute(Qt::WA_TranslucentBackground);//背景透明
- init_control();//控件布局
- init_connect();//按钮-信号槽机制
- }
-
- //监控界面控件布局
- void Main_MonitorWidget::init_control()
- {
- this->totalLayout = new QHBoxLayout();//水平
- this->leftLayout = new QVBoxLayout();//垂直
- this->rightLayout = new QVBoxLayout();//垂直
- this->leftWidget =new QWidget();
- this->rightWidget =new QWidget();
- this->rightBottomWidget =new QWidget();
- this->righttopWidget =new QWidget();
- this->rightBottomLayout=new QHBoxLayout();//水平
- this->righttopLayout = new QGridLayout();//网格
- this->leftWidget->setStyleSheet("background-color: rgb(252,157,154)");//背景颜色
-
- QListWidget *playList = new QListWidget;//视频列表
- //设置QListWidget的显示模式
- playList->setViewMode (QListView::IconMode) ;
- //设置QListWidget中单元项的间距
- playList->setSpacing(0) ;
- //设置自动适应布局调整(Adjust适应 Fixed不适应)--默认不适应设置
- playList->setResizeMode (QListWidget::Adjust);
- //设置不能移动
- playList->setMovement (QListWidget::Static);
- playList->setStyleSheet("border:none;font-size:15px");//边框尺寸15号字体
-
- //默认无背景--直到摄像头加入
- camera = Decode::getcamera();
- for(int i = 0;i<camera.size();i++)
- {
- //定义QListWidgetItem对象
- QListWidgetItem *playItem = new QListWidgetItem;
- //为单元项设置属性
- //设置文本相关
- playItem->setTextColor("white");
- playItem->setText(camera.at(i));
- //重新设置单元项图片的宽度和高度
- playItem->setSizeHint(QSize(200,50));
- //将单元项添加到QListWidget中
- playList->addItem(playItem);
- this->leftLayout->addWidget(playList);
- }
- this->leftWidget->setLayout(leftLayout);//左边布局设计
- //右上布局设计
- this->video1_label = new QLabel(this);//不适应设置--开启摄像头后适应窗口
- this->video1_label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- this->video1_label->setMinimumSize(100,30);//设置最大和最小窗口
- //label显示画面控件初始化--默认其他窗口的没有摄像头情况不显示监控
- this->video2_label = new QLabel(this);
- this->video2_label->setStyleSheet("background-color: rgb(252,157,154)");
- this->video3_label = new QLabel(this);
- this->video3_label->setStyleSheet("background-color: rgb(252,157,154)");
- this->video4_label = new QLabel(this);
- this->video4_label->setStyleSheet("background-color: rgb(252,157,154)");
- //添加到布局,田字格布局--网格布局设计
- this->righttopLayout->addWidget(video1_label,0,0);
- this->righttopLayout->addWidget(video2_label,0,1);
- this->righttopLayout->addWidget(video3_label,1,0);
- this->righttopLayout->addWidget(video4_label,1,1);
- //弹簧设计
- this->righttopLayout->setRowStretch(0,1);
- this->righttopLayout->setRowStretch(1,1);
- this->righttopLayout->setColumnStretch(0,1);
- this->righttopLayout->setColumnStretch(1,1);
- this->righttopWidget->setLayout(righttopLayout);//设置右上田字监控布局
- //右下按钮控件的布局设计
- this->single_screen_btn = new QPushButton("单",this);
- this->multi_screen_btn = new QPushButton("双",this);
- this->rightBottomLayout->addWidget(single_screen_btn);
- this->rightBottomLayout->addWidget(multi_screen_btn);
- this->rightBottomLayout->addStretch(0);//弹簧设计
- this->rightBottomWidget->setLayout(rightBottomLayout);//设置右下按钮控件布局
- //右边布局-比例设计
- this->rightLayout->addWidget(righttopWidget,95);//右上窗口比例
- this->rightLayout->addWidget(rightBottomWidget,5);//右下控件窗口比例
- this->rightWidget->setLayout(rightLayout);//设置布局
- //整体布局-比例设计
- this->totalLayout ->setSpacing(0);//表示各个控件之间的上下间距
- this->totalLayout->setMargin(0);//表示控件与窗体的左右边距
- this->totalLayout->addWidget(leftWidget,17);//左右窗口比例设计
- this->totalLayout->addWidget(rightWidget,83);//左右窗口比例设计
- this->setLayout(totalLayout);//设置布局
- }
-
- //连接函数-按钮信号槽机制
- void Main_MonitorWidget::init_connect()
- {
- connect(this->single_screen_btn,SIGNAL(clicked()),this,SLOT(ToSingle()));//单通道按钮
- connect(this->multi_screen_btn,SIGNAL(clicked()),this,SLOT(ToFour()));//多通道按钮
- }
-
- //实时显示监控画面解码函数
- void Main_MonitorWidget::startdecode()
- {
- this->decodeThread =new Decode();
- decodeThread->start();//启动解码线程
- connect(decodeThread,SIGNAL(sendImg(QImage)),this,SLOT(receiveImg(QImage)));//发送接收图片信号
- }
-
- //接收图片函数
- void Main_MonitorWidget::receiveImg(QImage img)
- {
- this->image =img;
- this->update();
- }
-
- //监控界面label控件接收图片事件--重绘事件实现开启摄像头窗口自适应显示画面
- void Main_MonitorWidget::paintEvent(QPaintEvent *)
- {
- //如果这个图片不为空
- if(!this->image.isNull())
- {
- //画面图片显示在label载体上
- QPixmap *image = new QPixmap(QPixmap::fromImage(this->image));
- image->scaled(video1_label->size(),Qt::KeepAspectRatio);
- video1_label->setPixmap(QPixmap::fromImage(this->image));
- video1_label->setScaledContents(true);
- }
- }
-
- //切换单画面模式
- void Main_MonitorWidget::ToSingle()
- {
- //关闭其他监控窗口
- this->righttopLayout->removeWidget(video2_label);
- this->righttopLayout->removeWidget(video3_label);
- this->righttopLayout->removeWidget(video4_label);
- this->video2_label->setVisible(false);//数据模型构造完毕
- this->video3_label->setVisible(false);//数据模型构造完毕
- this->video4_label->setVisible(false);//数据模型构造完毕
- this->video1_label->setMinimumSize(1109,703);//监控摄像头最大最小窗口设计之单画面
- }
-
- //切换多画面模式--网格布局
- void Main_MonitorWidget::ToFour()
- {
- this->video1_label->setMinimumSize(100,30);//监控摄像头最大最小窗口设计之多画面
- this->righttopLayout->addWidget(video2_label);
- this->righttopLayout->addWidget(video3_label);
- this->righttopLayout->addWidget(video4_label);
- this->video2_label->setVisible(true);//数据模型构造完毕
- this->video3_label->setVisible(true);//数据模型构造完毕
- this->video4_label->setVisible(true);//数据模型构造完毕
- //网格布局-田字
- this->righttopLayout->addWidget(video1_label,0,0);
- this->righttopLayout->addWidget(video2_label,0,1);
- this->righttopLayout->addWidget(video3_label,1,0);
- this->righttopLayout->addWidget(video4_label,1,1);
- //弹簧设计
- this->righttopLayout->setRowStretch(0,1);
- this->righttopLayout->setRowStretch(1,1);
- this->righttopLayout->setColumnStretch(0,1);
- this->righttopLayout->setColumnStretch(1,1);
- }
- #ifndef MAIN_REPLAYWIDGET_H
- #define MAIN_REPLAYWIDGET_H
-
- #include <QWidget>
- #include <QLabel>//标签文本
- #include <QPushButton>//按钮
- #include <QHBoxLayout>//水平
- #include <QVBoxLayout>//垂直
- #include<QGridLayout>//网格
- #include <QPaintEvent>//绘图事件
- #include<QList>//链表
- #include<QImage>//图像
- #include<QPixmap>//嵌入图
- #include<QStackedWidget>//栈窗口
- #include<QListWidget>//窗口列表
- #include<QDebug>//调试
- #include <QCalendarWidget>//日历窗口
- #include <QDateEdit>//编辑日期
- #include <QFile>//文件操作
- #include "videocontrol.h"//视频控制层
- #include "imagecontrol.h"//图像控制层
- #include "videomodel.h"//视频模型层
- #include "imagemodel.h"//图像模型层
- #include "play_widget.h"//视频播放窗
- #include "image_widget.h"//图像显示窗
- //#include"decode_replay.h"//回放解码
-
- class Main_ReplayWidget : public QWidget
- {
- Q_OBJECT
- public:
- // explicit Main_ReplayWidget(QWidget *parent = 0);
- explicit Main_ReplayWidget(QWidget *parent = nullptr);//构造
- void init_UI();//UI窗口
- void init_connect();//控件布局
- void videolist();//更新视频列表函数
- void imagelist();//更新图片列表函数
- void lastvideo_play();//回放最后一个视频函数
- private:
- QWidget *leftWidget,*rightWidget,*rightWidget2,*midWidget,*rightBottomWidget,*righttopWidget;//窗口布局
- QVBoxLayout *leftLayout,*rightLayout,*righttopLayout,*midLayout;//垂直布局
- QStackedWidget *StackedWidget;//栈窗口
- QHBoxLayout *rightBottomLayout,*totalLayout,*rightLayout2;//水平布局
- QPushButton *Inquire_btn,*Next_btn,*Previous_btn,*video_btn,*image_btn;//按钮
- QLabel *video_label,*video_label2;//标签文本
- QImage image;//图像
- QListWidget *playList,*image_List;//列表窗口
- Play_Widget *replayWidget;//播放窗口
- Image_Widget *ImageWidget;//图像窗口
- QWidget *leftWidget1,*bottomWidget,*rightWidget3,*rightWidget4,*topWidget;//窗口布局
- QVBoxLayout *leftLayout1,*rightLayout3;//垂直布局
- QHBoxLayout *rightLayout4,*bottomLayout;//水平布局
- QGridLayout *topLayout;//网格布局
- QLabel *name_label,*size_label,*resolution_label;//文本
- Decode_Replay *decodeThread;//回放解码线程
- int page;//页数
- QDateEdit *date;//日期编辑框
- QString *date_time;//日期
- QImage Image;//图像
- QImage image_size;//图像
- protected:
- void paintEvent(QPaintEvent *);//重绘事件--视频回放界面label控件接收图片事件
-
- signals:
-
- public slots:
- void click_video(QListWidgetItem *item);//点击视频列表播放视频
- void tovideo();//切换视频列表函数
- void toimage();//切换图片列表函数
- void next();//图片列表下一页函数
- void previous();//图片列表上一页函数
- void calendar_query();//日历查询函数
- void receiveimg(QImage img);//视频回放界面接收图片函数
- void click_image(QListWidgetItem *item);//点击图片槽函数
- };
-
- #endif // MAIN_REPLAYWIDGET_H
- #include "main_replaywidget.h"
-
- //构造
- Main_ReplayWidget::Main_ReplayWidget(QWidget *parent) : QWidget(parent)
- {
- this->page=1;//页数初始化
- init_UI();//UI窗口
- }
-
- //界面布局
- void Main_ReplayWidget::init_UI()
- {
- //视频回放布局初始化
- this->totalLayout = new QHBoxLayout();//水平
- this->leftLayout = new QVBoxLayout();//垂直
- this->leftWidget = new QWidget();
- this->rightLayout = new QVBoxLayout();//垂直
- this->rightWidget = new QWidget();
- this->rightLayout2 = new QHBoxLayout();//水平
- this->rightWidget2 = new QWidget();
- this->midLayout = new QVBoxLayout();//垂直
- this->midWidget = new QWidget();
- this->rightBottomWidget =new QWidget();
- this->rightBottomLayout = new QHBoxLayout();//水平
- this->righttopWidget =new QWidget();
- this->righttopLayout= new QVBoxLayout();//垂直
- this->StackedWidget =new QStackedWidget();//栈窗口
- this->video_btn = new QPushButton("视频回放",this);//视频控件
- this->image_btn = new QPushButton("图片列表",this);//图像控件
- //视频回放---设置左边和右边背景颜色
- this->leftWidget->setStyleSheet("background-color: rgb(252,157,154)");
- this->righttopWidget->setStyleSheet("background-color: rgb(252,157,154)");
- //视频回放---右边视频回放、图片回放按钮布局
- this->leftLayout->addWidget(video_btn);
- this->leftLayout->addWidget(image_btn);
- //视频回放---设置弹簧,使两个按钮放到顶部
- this->leftLayout->addStretch(0);
- this->leftWidget->setLayout(leftLayout);
- //视频回放---中间布局
- this->video_label = new QLabel();
- this->video_label2 = new QLabel();
- this->midLayout->addWidget(video_label,7);//比例设计
- this->midLayout->addWidget(video_label2,3);//比例设计
- this->video_label->setMinimumSize(750,420);//最大最小尺寸
- this->midWidget->setLayout(midLayout);//放置中间布局
- //视频回放---右边视频列表布局
- this->playList = new QListWidget;
- //设置QListWidget中单元项的间距
- playList->setSpacing(0);//各个控件间的上下间距
- //设置自动适应布局调整(Adjust适应, Fixed不适应),默认不适应
- playList->setResizeMode(QListWidget::Adjust);
- //设置不能移动
- playList->setMovement(QListWidget::Static);
- playList->setStyleSheet("border:none;font-size:15px");
- playList->setIconSize(QSize(120,130));
-
- QList<QString> titleList;
- QList<QString> coverList;
- //从数据库获取视频信息,返回qres
- char **qres;
- qres=VideoControl::getInstance()->getVideoPath();
- //用List存视频路径,跳过表头,自增2存一次
- for(int i=VideoModel::col;i<(VideoModel::row+1)*VideoModel::col;i+=2)
- {
- titleList<<qres[i];
- }
- //用List存封面路径,跳过表头,自增2存一次
- for(int i=VideoModel::col+1;i<(VideoModel::row+1)*VideoModel::col;i+=2)
- {
- coverList<<qres[i];
- }
- //将得到的list添加到QListWidgetItem单元项里面
- for (int i=0;i<titleList.size();i++)
- {
- //定义QListWidgetItem对象
- QListWidgetItem *playItem = new QListWidgetItem ;
- //为单元项设置属性
- //设置
- playItem->setIcon(QIcon(coverList[i]));
- playItem->setTextColor("white");
- playItem->setText(titleList.at(i));
- //重新设置单元项图片的宽度和高度
- playItem->setSizeHint(QSize(150,170));
- //将单元项添加到QListWidget中
- playList->addItem(playItem);
- }
- //将视频列表添加到布局里
- this->righttopLayout->addWidget(playList) ;
- this->righttopWidget->setLayout(righttopLayout);
-
- //视频回放---右边日历查询布局
- this->Inquire_btn = new QPushButton("查询",this);
- //日历控件初始化
- this->date = new QDateEdit();
- this->date->setCalendarPopup(true);
- this->date->setDate(QDate::currentDate());
- this->date->setFixedSize(160,40);
- //查询和日历控件添加到布局里
- this->rightBottomLayout->addWidget(date);
- this->rightBottomLayout->addWidget(Inquire_btn);
- this->rightBottomWidget->setLayout(rightBottomLayout);
- //日历查询布局和视频列表布局比例为1:9
- this->rightLayout->addWidget(rightBottomWidget,1);
- this->rightLayout->addWidget(righttopWidget,9);
- this->rightWidget->setLayout(rightLayout);
- //视频播放布局和视频列表布局比例为7:3
- this->rightLayout2->addWidget(midWidget,7);
- this->rightLayout2->addWidget(rightWidget,3);
- this->rightWidget2->setLayout(rightLayout2);
- //将视频回放布局添加到堆栈布局里
- this->StackedWidget->addWidget(rightWidget2);
- //图片回放布局初始化
- this->leftWidget1=new QWidget();
- this->bottomWidget=new QWidget();
- this->rightWidget3=new QWidget();
- this->rightWidget4=new QWidget();
- this->topWidget=new QWidget();
- this->leftLayout1=new QVBoxLayout();//垂直
- this->bottomLayout=new QHBoxLayout();//水平
- this->rightLayout3=new QVBoxLayout();//垂直
- this->rightLayout4=new QHBoxLayout();//水平
- this->topLayout=new QGridLayout();//网格
- //图片回放控件初始化
- this->name_label=new QLabel("照片名称:",this);
- this->size_label=new QLabel("照片大小:",this);
- this->resolution_label=new QLabel("照片尺寸:",this);
- this->Next_btn = new QPushButton("下一页",this);
- this->Previous_btn = new QPushButton("上一页",this);
- //图片回放---中间图片列表布局
- this->image_List = new QListWidget;
- //设置QListWidget的显示模式
- image_List->setViewMode (QListView::IconMode);
- //设置QListWidget中单元项的间距
- image_List->setSpacing(4);
- //设置自动适应布局调整(Adjust适应, Fixed不适应),默认不适应
- image_List->setResizeMode (QListWidget::Adjust) ;
- //设置不能移动
- image_List->setMovement (QListWidget::Static);
- image_List->setStyleSheet("border:none;font-size:15px");
- image_List->setIconSize(QSize(230,230));
-
- QList<QString> ImageList;
- QList<QString> nameList;
- //从数据库获取图片信息,返回qres
- char **qres2;
- qres2=ImageControl::getInstance()->getImagePath(page);
- //用List存视频路径,跳过表头,自增2存一次
- for(int i=ImageModel::col;i<(ImageModel::row+1)*ImageModel::col;i+=2)
- {
- ImageList<<qres2[i];
- }
- //用List存视频名称,跳过表头,自增2存一次
- for(int i=ImageModel::col+1;i<(ImageModel::row+1)*ImageModel::col;i+=2)
- {
- nameList<<qres2[i];
- }
- //将得到的list添加到QListWidgetItem单元项里面
- for (int i=0;i<ImageList.size();i++)
- {
- //定义QListWidgetItem对象
- QListWidgetItem *imageItem = new QListWidgetItem;
- //为单元项设置属性
- //设置
- imageItem->setIcon(QIcon(ImageList[i]));
- imageItem->setText(nameList.at(i));
- //重新设置单元项图片的宽度和高度
- imageItem->setSizeHint(QSize(220,220));
- //将单元项添加到QListWidget中
- image_List->addItem(imageItem);
- }
- //将图片列表添加到布局里
- this->topLayout->addWidget(image_List);
- this->topWidget->setLayout(topLayout);
- //图片回放---中间下边翻页布局
- this->bottomLayout->addWidget(Previous_btn);//上一页
- this->bottomLayout->addWidget(Next_btn);//下一页
- this->bottomWidget->setLayout(bottomLayout);//控件窗口布局
- //图片回放---中间图片列表布局和下边翻页布局比例为95:5
- this->leftLayout1->addWidget(topWidget,95);
- this->leftLayout1->addWidget(bottomWidget,5);
- this->leftWidget1->setLayout(leftLayout1);
- //图片回放---右边图片信息布局
- this->rightLayout3->addWidget(name_label);
- this->rightLayout3->addWidget(size_label);
- this->rightLayout3->addWidget(resolution_label);
- //图片回放---用弹簧把label设置到布局顶部
- this->rightLayout3->addStretch(0);//弹簧
- this->rightWidget3->setLayout(rightLayout3);
- //图片列表布局和图片信息布局比例为8:2
- this->rightLayout4->addWidget(leftWidget1,8);
- this->rightLayout4->addWidget(rightWidget3,2);
- this->rightWidget4->setLayout(rightLayout4);
- //堆栈窗口
- this->StackedWidget->addWidget(rightWidget4);
- this->StackedWidget->setCurrentWidget(rightWidget2);
- //总布局
- this->totalLayout ->setSpacing(0);//表示各个控件之间的上下间距
- this->totalLayout->setMargin(0);//表示控件与窗体的左右边距
- this->totalLayout->addWidget(leftWidget,15);//比例
- this->totalLayout->addWidget(StackedWidget,85);//比例
- this->setLayout(totalLayout);
- }
-
- //连接函数-按钮信号槽机制
- void Main_ReplayWidget::init_connect()
- {
- //点击视频列表播放视频
- connect(playList,SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(click_video(QListWidgetItem *)));
- //切换视频列表
- connect(video_btn,SIGNAL(clicked()),this,SLOT(tovideo()));
- //切换图片列表
- connect(image_btn,SIGNAL(clicked()),this,SLOT(toimage()));
- //图片列表上一页
- connect(Previous_btn,SIGNAL(clicked()),this,SLOT(previous()));
- //图片列表下一页
- connect(Next_btn,SIGNAL(clicked()),this,SLOT(next()));
- //日历查询
- connect(Inquire_btn,SIGNAL(clicked()),this,SLOT(calendar_query()));
- //视频回放界面接收图片
- connect(decodeThread, SIGNAL(sendImg2(QImage)), this, SLOT(receiveimg(QImage)));
- //点击图片
- connect(image_List, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(click_image(QListWidgetItem *)));
- }
-
- //更新视频列表函数
- void Main_ReplayWidget::videolist()
- {
- //更新视频列表 删去所有item
- this->playList->deleteLater();
- this->playList =new QListWidget();
- this->righttopLayout->deleteLater();
- this->righttopLayout= new QVBoxLayout();
- this->righttopWidget->deleteLater();
- this->righttopWidget=new QWidget();
-
- //设置QListWidget的显示模式
- playList-> setSpacing(0) ;//设置QListWidget中单元项的间距
- //设置自动适应布局调整(Adjust适应,Fixed不适应)--默认不适应
- playList-> setResizeMode (QListWidget::Adjust) ;
- //设置不能移动
- playList-> setMovement (QListWidget::Static) ;
- playList->setStyleSheet("border:none;font-size:15px");
- playList->setIconSize(QSize(120,130));
-
- char **qres;
- qres=VideoControl::getInstance()->getVideoPath();
-
- QList<QString> titleList;
- QList<QString> coverList;
- for(int i=VideoModel::col;i<(VideoModel::row+1)*VideoModel::col;i+=2)
- {
- titleList<<qres[i];
- }
- for(int i=VideoModel::col+1;i<(VideoModel::row+1)*VideoModel::col;i+=2)
- {
- coverList<<qres[i];
- }
- for (int i=0;i<titleList.size();i++)
- {
- //定义QListWidgetItem对象
- QListWidgetItem *playItem = new QListWidgetItem ;
- //为单元项设置属性
- playItem->setIcon(QIcon(coverList[i]));
- playItem->setText(titleList.at(i));
- //重新设置单元项图片的宽度和高度
- playItem->setSizeHint(QSize(150,170));
- //将单元项添加到QListWidget中
- playList->addItem(playItem);
- }
- this->righttopLayout->addWidget(playList);
- this->righttopWidget->setLayout(righttopLayout);
- this->righttopWidget->setStyleSheet("background-color: rgb(252,157,154)");
- this->rightLayout->addWidget(righttopWidget,9);
- connect(playList,SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(click_video(QListWidgetItem *)));
- }
-
- //更新图片列表函数
- void Main_ReplayWidget::imagelist()
- {
- //更新视频列表 删去所有item
- this->image_List->deleteLater();
- this->image_List =new QListWidget();
- this->topLayout->deleteLater();
- this->topLayout= new QGridLayout();
- this->topWidget->deleteLater();
- this->topWidget=new QWidget();
-
- //设置QListWidget的显示模式
- image_List-> setViewMode (QListView::IconMode);
- //设置QListWidget中单元项的间距
- image_List-> setSpacing(4);
- //设置自动适应布局调整(Adjust适应, Fixed不适应),默认不适应
- image_List-> setResizeMode (QListWidget::Adjust) ;
- //设置不能移动
- image_List-> setMovement (QListWidget::Static) ;
- image_List->setStyleSheet("border:none;font-size:15px");
- image_List->setIconSize(QSize(230,230));
-
- QList<QString> ImageList;
- QList<QString> nameList;
- char **qres2;
- qres2=ImageControl::getInstance()->getImagePath(this->page);
- for(int i=ImageModel::col;i<(ImageModel::row+1)*ImageModel::col;i+=2)
- {
- ImageList<<qres2[i];
- }
- for(int i=ImageModel::col+1;i<(ImageModel::row+1)*ImageModel::col;i+=2)
- {
- nameList<<qres2[i];
- }
- for (int i=0;i<ImageList.size();i++)
- {
- //定义QListWidgetItem对象
- QListWidgetItem *imageItem = new QListWidgetItem;
- //为单元项设置属性
- //设置
- imageItem->setIcon(QIcon(ImageList[i]));
- imageItem->setText(nameList.at(i));
- //重新设置单元项图片的宽度和高度
- imageItem->setSizeHint(QSize(220,220));
- //将单元项添加到QListWidget中
- image_List->addItem(imageItem);
- }
- //重新添加到布局里面
- this->topLayout->addWidget(image_List);
- this->topWidget->setLayout(topLayout);
- this->leftLayout1->addWidget(topWidget,95);
- this->leftLayout1->addWidget(bottomWidget,5);
- connect(image_List, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(click_image(QListWidgetItem *)));
- }
-
- //回放最后一个视频函数
- void Main_ReplayWidget::lastvideo_play()
- {
- //从数据库获取最后一个视频路径
- char**res;
- res=VideoModel::getInstance()->getLastvideo();
- QString lastvdieo =res[1];
- //如果没有就返回
- if(lastvdieo.length()==0)
- {
- QMessageBox::warning(this, tr("提示!"),tr("暂无视频可播放!"),QMessageBox::Yes);
- return;
- }
- //找到就传路径给解码线程并且打开
- this->decodeThread=new Decode_Replay(lastvdieo);
- this->decodeThread->start();
- }
-
- //槽函数--点击视频列表播放视频
- void Main_ReplayWidget::click_video(QListWidgetItem *item)
- {
- //通过点击item获取对应的text,也就是视频名称,再传给control层去查询数据库
- char **qres=VideoControl::getInstance()->getVideo(item->text());
- replayWidget =new Play_Widget(qres[1]);
- replayWidget->show();
- }
-
- //点击图片槽函数
- void Main_ReplayWidget::click_image(QListWidgetItem *item)
- {
- //获取该item的text,即图片名字,然后到数据库查询图片路径
- int size;
- char **qres=ImageControl::getInstance()->getimage(item->text());
- QFile myfile(qres[1]);
- //获取图片大小
- if(myfile.open(QIODevice::ReadOnly))
- {
- size = myfile.size();
- myfile.close();
- }
- //获取图片宽高
- this->image_size.load(qres[1]);
- this->name_label->setText("图片名称:"+item->text());
- this->size_label->setText("图片大小:"+QString::number(size/1024)+" KB");
- this->resolution_label->setText("照片尺寸:"+QString::number(image_size.height())
- +" X "+QString::number(image_size.width()));
- //获得图片路径,加载出图片放大窗口
- this->ImageWidget=new Image_Widget(qres[1]);
- this->ImageWidget->show();
- }
-
- //切换视频列表函数
- void Main_ReplayWidget::tovideo()
- {
- //用堆栈布局显示视频列表布局
- this->StackedWidget->setCurrentWidget(rightWidget2);
- }
- //切换图片列表函数
- void Main_ReplayWidget::toimage()
- {
- //用堆栈布局显示图片列表布局
- this->StackedWidget->setCurrentWidget(rightWidget4);
- imagelist();
- }
- //图片列表下一页函数
- void Main_ReplayWidget::next()
- { //先判断数据库下一个区间是否还有图片
- this->page++;
- char **qres3;
- QList<QString> ImageList;
- qres3=ImageControl::getInstance()->getImagePath(this->page);
- for(int i=ImageModel::col;i<(ImageModel::row+1)*ImageModel::col;i+=1)
- {
- ImageList<<qres3[i];
- }
- //如果没有就提示,并恢复原来页数
- if(ImageList.size()==0)
- {
- QMessageBox::warning(this, tr("提示!"),tr("已经是最后一页!"),QMessageBox::Yes);
- this->page--;
- }
- //否则加加载图片
- else
- {
- imagelist();
- }
- }
-
- //图片列表上一页函数
- void Main_ReplayWidget::previous()
- {
- //如果页数不是第一页就继续加载图片
- if(this->page>1)
- {
- this->page--;
- imagelist();
- }
- //如果页数是第一页就提示
- else
- {
- QMessageBox::warning(this, tr("提示!"),tr("已经是第一页!"),QMessageBox::Yes);
- }
- }
-
- //日历查询函数
- void Main_ReplayWidget::calendar_query()
- {
- //获取日历控件的参数,并修改格式yyyyMMdd
- QString time = date->dateTime().toString("yyyyMMdd");
- //control层传参查询数据库是否有该日期视频
- char **qres;
- qres=VideoControl::getInstance()->calendar_query(time);
- QList<QString> titleList;
- QList<QString> coverList;
- for(int i=VideoModel::col;i<(VideoModel::row+1)*VideoModel::col;i+=2)
- {
- titleList<<qres[i];
- }
- //如果没有就提示,并返回
- if(titleList.size()==0)
- {
- QMessageBox::warning(this, tr("提示!"),tr("没有该日期视频数据!"),QMessageBox::Yes);
- return;
- }
- //如果有就删除布局,并重新new出来
- this->playList->deleteLater();
- this->playList =new QListWidget();
- this->righttopLayout->deleteLater();
- this->righttopLayout= new QVBoxLayout();
- this->righttopWidget->deleteLater();
- this->righttopWidget=new QWidget();
-
- playList->setSpacing(0);
- //设置自动适应布局调整(Adjust适应, Fixed不适应),默认不适应
- playList->setResizeMode (QListWidget::Adjust);
- //设置不能移动
- playList->setMovement (QListWidget::Static);
- playList->setStyleSheet("border:none;font-size:15px");
- playList->setIconSize(QSize(110,120));
-
- for(int i=VideoModel::col+1;i<(VideoModel::row+1)*VideoModel::col;i+=2)
- {
- coverList<<qres[i];
- }
- for (int i=0;i<titleList.size();i++)
- {
- //定义QListWidgetItem对象
- QListWidgetItem *playItem = new QListWidgetItem;
- //为单元项设置属性
- playItem->setIcon(QIcon(coverList[i]));
- playItem->setText(titleList.at(i));
- //重新设置单元项图片的宽度和高度
- playItem->setSizeHint(QSize(150,250));
- //将单元项添加到QListWidget中
- playList->addItem(playItem);
- }
- this->righttopLayout->addWidget(playList);
- this->righttopWidget->setLayout(righttopLayout);
- this->righttopWidget->setStyleSheet("background-color: rgb(252,157,154)");
- this->rightLayout->addWidget(righttopWidget,9);
- connect(playList,SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(click_video(QListWidgetItem *)));
- }
-
- //视频回放界面接收图片函数
- void Main_ReplayWidget::receiveimg(QImage img)
- {
- this->Image =img;
- this->update();
- }
-
- //视频回放界面label控件接收图片事件
- void Main_ReplayWidget::paintEvent(QPaintEvent *)
- {
- if(!this->Image.isNull())
- {
- QPixmap *image = new QPixmap(QPixmap::fromImage(this->Image));
- image->scaled(video_label->size(),Qt::KeepAspectRatio);
- //控件接收图片
- video_label->setPixmap(QPixmap::fromImage(this->Image));
- video_label->setScaledContents(true);
- }
- }
- #ifndef PLAY_WIDGET_H
- #define PLAY_WIDGET_H
-
- #include <QWidget>
- #include <QLabel>//标签文本
- #include <QPushButton>//按钮
- #include <QHBoxLayout>//水平
- #include <QVBoxLayout>//垂直
- #include <QPaintEvent>//重绘
- #include<QComboBox>//下拉框
- #include<QImage>//图像
- #include<QPixmap>//嵌入图
- #include "decode_replay.h"//解码回放
- #include "ftrancetomp4.h"//转码
- #include<QMessageBox>//消息框
-
- class Play_Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Play_Widget(QString PATH,QWidget *parent = nullptr);//构造
- void init_UI();//UI窗口
- void init_control();//控件布局
- void init_connect();//按钮-信号槽机制
- Decode_Replay *decodeThread;//解码回放
- static QString path;//路径
- private:
- QVBoxLayout *totalLayout;//垂直布局
- QWidget *bottomWidget,*topWidget;//窗口布局
- QHBoxLayout *bottomLayout,*topLayout;//水平布局
- QLabel *video_label;//标签文本
- QPushButton *play_btn,*screenshots_btn,*export_btn;//按钮
- QComboBox *Timesthespeed_box;//下拉框
- QImage Image;//图片
- FTranceTomp4 *trance;//转码
- int mark;//标志位--播放暂停
- protected:
- void paintEvent(QPaintEvent *);//重绘事件--监控界面label控件接收图片事件
-
- signals:
-
- public slots:
- void receiveimg(QImage img);//接收图片槽函数
- void continue_stop();//视频暂停函数
- void screenshots();//截图函数
- void trancetomp4();//转码导出视频函数
- };
-
- #endif // PLAY_WIDGET_H
- #include "play_widget.h"
-
- QString Play_Widget::path=nullptr;//路径初始化
-
- //播放界面构造函数
- Play_Widget::Play_Widget(QString PATH,QWidget *parent) : QWidget(parent)
- {
- this->mark = 1;//mark为暂停标记,1表示继续播放,0 表示暂停
- init_UI();//UI窗口
- init_control();//控件布局
- //path为视频路径
- this->path=PATH;
- //创建一个解码线程
- this->decodeThread=new Decode_Replay(path);
- //启动线程
- this->decodeThread->start();
- init_connect();//按钮-信号槽机制
- }
-
- //播放界面参数设置
- void Play_Widget::init_UI()
- {
- this->setWindowTitle("播放界面");
- this->setFixedSize(900,675);
- this->totalLayout = new QVBoxLayout();
- }
-
- //播放界面控件布局
- void Play_Widget::init_control()
- {
- this->bottomWidget=new QWidget();
- this->topWidget=new QWidget();
- this->bottomLayout=new QHBoxLayout();
- this->topLayout=new QHBoxLayout();
- this->video_label=new QLabel();
- this->play_btn=new QPushButton("暂停/播放",this);
-
- this->screenshots_btn=new QPushButton("截图",this);
- this->export_btn=new QPushButton("导出",this);
- //下拉框
- this->Timesthespeed_box = new QComboBox(this);
- this->Timesthespeed_box->clear();
- this->Timesthespeed_box->addItem("1X");
- this->Timesthespeed_box->addItem("0.5X");
- this->Timesthespeed_box->addItem("1.5X");
- this->Timesthespeed_box->addItem("2X");
- //放置画面
- this->video_label->setStyleSheet("background-color: rgb(252,157,154)");
- //放置画面-接收画面加载
- this->video_label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);//可拓展
- this->video_label->setMinimumSize(850,638);//最大最小尺寸
- this->topLayout->addWidget(video_label);
- this->topWidget->setLayout(topLayout);
- //控件设计
- this->bottomLayout->addWidget(play_btn);
- this->bottomLayout->addStretch(0);//弹簧
- this->bottomLayout->addWidget(Timesthespeed_box);
- this->bottomLayout->addWidget(screenshots_btn);
- this->bottomLayout->addWidget(export_btn);
- this->bottomWidget->setLayout(bottomLayout);//控件布局设计
- //整个布局比例
- this->totalLayout->addWidget(topWidget,9);//比例设计
- this->totalLayout->addWidget(bottomWidget,1);//比例设计
- this->setLayout(totalLayout);//整体布局
- }
-
- //按钮-信号槽机制
- void Play_Widget::init_connect()
- {
- //解码线程
- connect(Timesthespeed_box,SIGNAL(activated(QString)),decodeThread,SLOT(setSpeed(QString)));
- //视频暂停
- connect(play_btn, SIGNAL(clicked()), this, SLOT(continue_stop()));
- //接收图片
- connect(decodeThread, SIGNAL(sendImg2(QImage)), this, SLOT(receiveimg(QImage)));
- //截图
- connect(screenshots_btn, SIGNAL(clicked()), this, SLOT(screenshots()));
- //转码导出视频函数
- connect(export_btn, SIGNAL(clicked()), this, SLOT(trancetomp4()));
- }
-
- //接收图片槽函数
- void Play_Widget::receiveimg(QImage img)
- {
- this->Image =img;
- this->update();
- }
-
- //视频暂停函数
- void Play_Widget::continue_stop()
- {
- //如果标记为0,视频就开始
- if(this->mark==0)
- {
- decodeThread->status=0;
- this->mark=1;
- }
- //如果标记为1,视频就暂停
- else if(this->mark==1)
- {
- decodeThread->status=1;
- this->mark=0;
- }
- }
-
- //截图函数
- void Play_Widget::screenshots()
- {
- decodeThread->screenshots_mark=1;
- QMessageBox::warning(this, tr("提示!"),tr("截图成功!"),QMessageBox::Yes);
- }
-
- //转码导出视频函数
- void Play_Widget::trancetomp4()
- {
- //创建一个解码对象
- this->trance=new FTranceTomp4();
- //将视频路径传到解码
- this->trance->openH264File(path);
- this->trance->coverTomp4();
- QMessageBox::warning(this, tr("提示!"),tr("导出成功!"),QMessageBox::Yes);
- }
-
- //监控界面label控件接收图片事件
- void Play_Widget::paintEvent(QPaintEvent *)
- {
- if(!this->Image.isNull())
- {
- QPixmap *image = new QPixmap(QPixmap::fromImage(this->Image));
- image->scaled(video_label->size(),Qt::KeepAspectRatio);
- video_label->setPixmap(QPixmap::fromImage(this->Image));
- video_label->setScaledContents(true);
- }
- }
- #ifndef IMAGE_WIDGET_H
- #define IMAGE_WIDGET_H
-
- #include <QWidget>
- #include <QLabel>//标签文本
- #include <QHBoxLayout>//水平布局
- #include <QString>//字符串
- #include <QImage>//图片
-
- class Image_Widget : public QWidget
- {
- Q_OBJECT
- public:
- // explicit Image_Widget(QWidget *parent = 0);
- explicit Image_Widget(QString image_path,QWidget *parent = nullptr);//图片放大函数
- private:
- QLabel *image_label;//标签文本
- QHBoxLayout *totalLayout;//水平布局
-
- signals:
-
- public slots:
- };
-
- #endif // IMAGE_WIDGET_H
- #include "image_widget.h"
-
- //Image_Widget::Image_Widget(QWidget *parent) : QWidget(parent)
- //{
- //}
-
- //图片放大-构造函数
- Image_Widget::Image_Widget(QString image_path, QWidget *parent)
- {
- this->setWindowTitle("播放窗口画面");
- this->setFixedSize(640,481);
- this->totalLayout = new QHBoxLayout();//水平
- this->image_label = new QLabel();//放置画面
- QImage *image = new QImage(image_path);//获取画面
- this->image_label->setPixmap(QPixmap::fromImage(*image));//画面自适应载体
- this->image_label->setScaledContents(true);//图片自适应窗口控件大小
- this->totalLayout->addWidget(image_label);//播放窗口布局
- this->setLayout(totalLayout);//设置全局布局
- }
- #include "setwidget.h"//设置界面
- #include"myview.h"//开始动画设置
- #include <QApplication>
- #include"loginwidget.h"//登录界面
- #include"registerwidget.h"//注册界面
- #include"main_monitorwidget.h"//监控界面
- #include"main_replaywidget.h"//回放界面
- #include"play_widget.h"//播放界面
- #include"main_widget.h"//主界面
- #include"image_widget.h"//图像界面
- #include<QDebug>//测试
- #include"sqlite3.h"//数据库
-
- //当前C++兼容C语言
- extern "C"
- {
- //avcodec:编解码(最重要的库)
- #include <libavcodec/avcodec.h>
- //avformat:封装格式处理
- #include <libavformat/avformat.h>
- //swscale:视频像素数据格式转换
- #include <libswscale/swscale.h>
- //avdevice:各种设备的输入输出
- #include <libavdevice/avdevice.h>
- //avutil:工具库(大部分库都需要这个库的支持)
- #include <libavutil/avutil.h>
- }
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
-
- // //测试环境是否成功搭建
- // qDebug()<<"sqlite3版本"<<sqlite3_libversion();
-
- // qDebug("-------------------------------------------------------------------");
- // qDebug("%s", avcodec_configuration());
- // qDebug("version: %d", avcodec_version());
- // qDebug("-------------------------------------------------------------------");
-
- //开机动画
- myView kaiji;//对象创建
- kaiji.show();//调用方法
- return a.exec();
- }