Qt视频监控窗口布局

效果展示

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);
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现一个视频监控系统,需要以下步骤: 1. 获得视频流:需要使用摄像头或者IP摄像头来获取视频流。 2. 解码视频流:将视频流进行解码,获得视频的原始数据。 3. 显示视频:使用Qt的多媒体模块来实现视频的显示,可以使用QWidget或QML来实现。 4. 视频处理:可以对视频进行一些处理,比如视频的压缩、加密等。 5. 视频存储:将视频存储到本地或者云端,可以使用Qt的网络模块来实现。 下面是一个简单的Qt视频监控程序的示例代码: ```cpp #include <QApplication> #include <QCamera> #include <QCameraViewfinder> #include <QVBoxLayout> #include <QMediaRecorder> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建一个摄像头对象 QCamera *camera = new QCamera(); // 创建一个视频显示控件 QCameraViewfinder *viewfinder = new QCameraViewfinder(); // 创建一个视频录制对象 QMediaRecorder *mediaRecorder = new QMediaRecorder(camera); // 设置视频录制的输出格式 mediaRecorder->setOutputFormat(QMediaRecorder::AviFormat); // 设置视频录制的输出文件名 QString fileName = "output.avi"; mediaRecorder->setOutputLocation(QUrl::fromLocalFile(fileName)); // 创建一个垂直布局器,并把视频显示控件添加进去 QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(viewfinder); // 创建一个窗口,并设置布局器 QWidget *window = new QWidget(); window->setLayout(layout); // 设置摄像头的视图 camera->setViewfinder(viewfinder); // 开始录制视频 mediaRecorder->record(); // 显示窗口 window->show(); // 运行主循环 return a.exec(); } ``` 这个程序使用了Qt的多媒体模块来实现视频的显示和录制。在程序运行时,会打开摄像头,并将视频显示在窗口中。同时,程序还会将视频录制到本地文件中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值