效果展示
bandicam 2022-08-04 16-32-54-248
源代码
头文件
#ifndef VIDEOSURVEILLANCE_H
#define VIDEOSURVEILLANCE_H
#include <QWidget>
#include <QEvent>
#include <QMouseEvent>
#include <QMenu>
#include <QLabel>
#include <QLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
QT_BEGIN_NAMESPACE
namespace Ui { class videoSurveillance; }
QT_END_NAMESPACE
struct WidgetLayout
{
QWidget* widget;
QVBoxLayout* layout;
QLabel* label;
WidgetLayout() {}
};
class videoSurveillance : public QWidget
{
Q_OBJECT
public:
videoSurveillance(QWidget *parent = nullptr);
~videoSurveillance();
void initUi();
protected:
bool eventFilter(QObject *watched, QEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
private:
//创建通道布局
//QWidget* creationLayout();
//删除所有通道
void delAllWidget();
//字符串截取数字
int strCutNumber(QString str);
int strCutNumber(QString str, QString sep);
private slots:
void triggeredOne(QAction *action);
void triggeredFour(QAction *action);
void triggeredEnght(QAction *action);
//全屏显示通道
void fullScreenShowWidget();
//切换1画面
void cutOneWidget(int indexWidget);
//切换4画面
void cutFourWidget(int indexWidget);
//切换8画面
void cutEnghtWidget(int indexWidget);
//切换8画面1大7小
void cutOneBigSevenLitteWidget(int indexWidget);
//切换16画面
void cutSixTeenWidget();
void on_pushButton_5_clicked();
private:
Ui::videoSurveillance *ui;
bool m_IsRightClick;
int m_CurrentSelectWidget;
int m_CurrentOneWidget; // 保存窗口第一个通道
QWidget* m_FullScreenWidget;
bool m_IsFullScreenShow;
QMenu* m_Menu;
QList<WidgetLayout> m_AllWidgetList;
};
#endif // VIDEOSURVEILLANCE_H
cpp文件
#include "videosurveillance.h"
#include "ui_videosurveillance.h"
#include <QDebug>
videoSurveillance::videoSurveillance(QWidget *parent)
: QWidget(parent)
, ui(new Ui::videoSurveillance)
, m_IsRightClick(false)
, m_CurrentSelectWidget(1)
, m_CurrentOneWidget(1)
, m_FullScreenWidget(nullptr)
, m_IsFullScreenShow(false)
{
ui->setupUi(this);
initUi();
}
videoSurveillance::~videoSurveillance()
{
delete ui;
}
void videoSurveillance::initUi()
{
int number = 0;
for (int i = 1; i <= 4; ++i) {
for (int j = 1; j <= 4; ++j) {
WidgetLayout wLayout;
number++;
QWidget* widget = new QWidget();
widget->setObjectName(QString("Widget_%1").arg(number));
widget->installEventFilter(this);
widget->setStyleSheet("border-width: 1px; border-style: solid; border-color: red;");
QLabel* label = new QLabel(QString("通道%1").arg(number));
label->setStyleSheet("border: none;");
QVBoxLayout * layout = new QVBoxLayout();
layout->addWidget(label);
widget->setLayout(layout);
ui->gridLayout->addWidget(widget, i, j);
//保存所有控件
wLayout.widget = widget;
wLayout.label = label;
wLayout.layout = layout;
m_AllWidgetList.append(wLayout);
}
}
QMenu* menuOne = new QMenu("切换1画面");
for (int i = 1; i <= 16; ++i) {
QAction* action = new QAction(QString("切换%1通道").arg(i));
menuOne->addAction(action);
}
connect(menuOne, SIGNAL(triggered(QAction*)), this, SLOT(triggeredOne(QAction*)));
QMenu* menuFour = new QMenu("切换4画面");
for (int i = 0; i < 4; ++i) {
QAction* action = new QAction(QString("切换%1-%2通道").arg(i * 4 + 1).arg((i + 1) * 4));
menuFour->addAction(action);
}
connect(menuFour, SIGNAL(triggered(QAction*)), this, SLOT(triggeredFour(QAction*)));
QMenu* menuEnght = new QMenu("切换8画面");
for (int i = 0; i < 2; ++i) {
QAction* action = new QAction(QString("切换%1-%2通道").arg(i * 8 + 1).arg((i +1) * 8));
menuEnght->addAction(action);
}
connect(menuEnght, SIGNAL(triggered(QAction*)), this, SLOT(triggeredEnght(QAction*)));
QAction* actionSixTeen = new QAction("切换16画面");
connect(actionSixTeen, SIGNAL(triggered(bool)), this, SLOT(cutSixTeenWidget()));
QAction* actionFullScreen = new QAction("全屏显示");
connect(actionFullScreen, SIGNAL(triggered(bool)), this, SLOT(fullScreenShowWidget()));
m_Menu = new QMenu(this);
m_Menu->addAction(actionFullScreen);
m_Menu->addMenu(menuOne);
m_Menu->addMenu(menuFour);
m_Menu->addMenu(menuEnght);
m_Menu->addAction(actionSixTeen);
//
m_FullScreenWidget = new QWidget();
m_FullScreenWidget->installEventFilter(this);
}
bool videoSurveillance::eventFilter(QObject *watched, QEvent *event)
{
for (int i = 0; i < m_AllWidgetList.size(); ++i) {
if (watched == m_AllWidgetList.at(i).widget) {
if (m_IsRightClick) {
m_CurrentSelectWidget = i;
qDebug() << "当前为" << m_CurrentSelectWidget;
m_Menu->move(cursor().pos());
m_Menu->show();
m_IsRightClick = false;
break;
}
if (event->type() == QEvent::MouseButtonDblClick && !m_IsFullScreenShow) {
m_CurrentSelectWidget = i;
qDebug() << "当前为" << m_CurrentSelectWidget;
fullScreenShowWidget();
}
}
}
if (watched == m_FullScreenWidget) {
if (event->type() == QEvent::MouseButtonDblClick && m_IsFullScreenShow) {
m_AllWidgetList[m_CurrentSelectWidget].widget->setLayout(m_FullScreenWidget->layout());
m_IsFullScreenShow = false;
m_FullScreenWidget->close();
}
}
return QWidget::eventFilter(watched, event);
}
void videoSurveillance::mousePressEvent(QMouseEvent *event)
{
}
void videoSurveillance::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
m_IsRightClick = true;
}
}
void videoSurveillance::on_pushButton_clicked()
{
cutOneWidget(m_CurrentOneWidget);
}
void videoSurveillance::on_pushButton_2_clicked()
{
cutFourWidget(m_CurrentOneWidget);
}
void videoSurveillance::on_pushButton_3_clicked()
{
cutEnghtWidget(m_CurrentOneWidget);
}
void videoSurveillance::delAllWidget()
{
for (int i = 0; i < m_AllWidgetList.size(); ++i) {
QWidget* w = m_AllWidgetList[i].widget;
ui->gridLayout->removeWidget(w);
m_AllWidgetList[i].widget->setVisible(false);
}
}
int videoSurveillance::strCutNumber(QString str)
{
QString number;
for(int i = 0; i < str.length(); i++) {
if (str[i] >= '0' && str[i] <= '9') {
number.append(str[i]);
}
}
return number.toInt();
}
int videoSurveillance::strCutNumber(QString str, QString sep)
{
QString number;
for(int i = 0; i < str.length(); i++) {
if (str[i] >= '0' && str[i] <= '9') {
number.append(str[i]);
}
if (str[i] == sep) {
return number.toInt();
}
}
return 1;
}
void videoSurveillance::triggeredOne(QAction *action)
{
int number = strCutNumber(action->text());
m_CurrentOneWidget = number;
cutOneWidget(number);
}
void videoSurveillance::triggeredFour(QAction *action)
{
int number = strCutNumber(action->text(), "-");
m_CurrentOneWidget = number;
cutFourWidget(number);
}
void videoSurveillance::triggeredEnght(QAction *action)
{
int number = strCutNumber(action->text(), "-");
m_CurrentOneWidget = number;
cutEnghtWidget(number);
}
void videoSurveillance::fullScreenShowWidget()
{
m_FullScreenWidget->setLayout(m_AllWidgetList[m_CurrentSelectWidget].widget->layout());
m_FullScreenWidget->showFullScreen();
m_IsFullScreenShow = true;
}
void videoSurveillance::cutOneWidget(int indexWidget)
{
if (m_AllWidgetList.isEmpty() || m_AllWidgetList.size() < indexWidget) {
return;
}
indexWidget--;
delAllWidget();
ui->gridLayout->addWidget(m_AllWidgetList[indexWidget].widget);
m_AllWidgetList[indexWidget].widget->setVisible(true);
}
void videoSurveillance::cutFourWidget(int indexWidget)
{
if (m_AllWidgetList.isEmpty()) {
return;
}
delAllWidget();
int number = indexWidget - 1;
//如果切换布局第一个通道+需要切换的画面数大于总数就--
while (number + 4 > m_AllWidgetList.size()) {
number--;
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
ui->gridLayout->addWidget(m_AllWidgetList[number].widget, i, j);
m_AllWidgetList[number].widget->setVisible(true);
number++;
}
}
}
void videoSurveillance::cutEnghtWidget(int indexWidget)
{
if (m_AllWidgetList.isEmpty()) {
return;
}
delAllWidget();
int number = indexWidget - 1;
//如果切换布局第一个通道+需要切换的画面数大于总数就--
while (number + 8 > m_AllWidgetList.size()) {
number--;
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 4; ++j) {
ui->gridLayout->addWidget(m_AllWidgetList[number].widget, i, j);
m_AllWidgetList[number].widget->setVisible(true);
number++;
}
}
}
void videoSurveillance::cutOneBigSevenLitteWidget(int indexWidget)
{
if (m_AllWidgetList.isEmpty()) {
return;
}
delAllWidget();
int number = indexWidget - 1;
//如果切换布局第一个通道+需要切换的画面数大于总数就--
while (number + 8 > m_AllWidgetList.size()) {
number--;
}
m_AllWidgetList[number].widget->setVisible(true);
m_AllWidgetList[number + 1].widget->setVisible(true);
m_AllWidgetList[number + 2].widget->setVisible(true);
m_AllWidgetList[number + 3].widget->setVisible(true);
m_AllWidgetList[number + 4].widget->setVisible(true);
m_AllWidgetList[number + 5].widget->setVisible(true);
m_AllWidgetList[number + 6].widget->setVisible(true);
m_AllWidgetList[number + 7].widget->setVisible(true);
ui->gridLayout->addWidget(m_AllWidgetList[number].widget, 0, 0, 3, 3);
ui->gridLayout->addWidget(m_AllWidgetList[number + 1].widget, 0, 3);
ui->gridLayout->addWidget(m_AllWidgetList[number + 2].widget, 1, 3);
ui->gridLayout->addWidget(m_AllWidgetList[number + 3].widget, 2, 3);
ui->gridLayout->addWidget(m_AllWidgetList[number + 4].widget, 3, 3);
ui->gridLayout->addWidget(m_AllWidgetList[number + 5].widget, 3, 2);
ui->gridLayout->addWidget(m_AllWidgetList[number + 6].widget, 3, 1);
ui->gridLayout->addWidget(m_AllWidgetList[number + 7].widget, 3, 0);
}
void videoSurveillance::cutSixTeenWidget()
{
if (m_AllWidgetList.isEmpty()) {
return;
}
delAllWidget();
m_CurrentOneWidget = 1;
int number = 0;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
ui->gridLayout->addWidget(m_AllWidgetList[number].widget, i, j);
m_AllWidgetList[number].widget->setVisible(true);
number++;
}
}
}
void videoSurveillance::on_pushButton_4_clicked()
{
cutSixTeenWidget();
}
void videoSurveillance::on_pushButton_5_clicked()
{
cutOneBigSevenLitteWidget(m_CurrentOneWidget);
}