多路h265监控录放开发-(3)右键菜单调整预览窗口数量1_4_9_16通过QGridLayout网格布局

16 篇文章 0 订阅
6 篇文章 0 订阅

xviewer.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_xviewer.h"
#include <QMenu>

class XViewer : public QWidget
{
    Q_OBJECT

public:
    XViewer(QWidget* parent = Q_NULLPTR);

    //右键菜单
    void contextMenuEvent(QContextMenuEvent* event) override;

    void View(int count);

public slots:
   
    void View1();
    void View4();
    void View9();
    void View16();


private:
    Ui::XViewerClass ui;
    QMenu left_menu_;
};

xviewer.cpp

#include "xviewer.h"
#include <QMouseEvent>

#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QResizeEvent>
#include <QDebug>
#include <QContextMenuEvent>
#include <QGridLayout>
//解决中文乱码
#define C(s) QString::fromLocal8Bit(s)

//一个指针数组,里面存了16个指向wgehit的指针
//cam_wids表示这16个指针的总大小 ,如果全为空则 cam_wids = 0,如果有两个不空,则cam_wids = 2 * //sizeof(QWidget*)这么大
static QWidget* cam_wids[16] = { 0 };

XViewer::XViewer(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
   
    //
  /// 初始化右键菜单
  // 视图=》  1 窗口
  //          4 窗口
    auto m = left_menu_.addMenu(C("视图"));
    auto a = m->addAction(C("1窗口"));
    connect(a, SIGNAL(triggered()), this, SLOT(View1()));
    a = m->addAction(C("4窗口"));
    connect(a, SIGNAL(triggered()), this, SLOT(View4()));
    a = m->addAction(C("9窗口"));
    connect(a, SIGNAL(triggered()), this, SLOT(View9()));
    a = m->addAction(C("16窗口"));
    connect(a, SIGNAL(triggered()), this, SLOT(View16()));

    //默认九窗口
    View9();
}
void XViewer::View1()
{
    View(1);
}
void XViewer::View4()
{
    View(4);
}
void XViewer::View9()
{
    View(9);
}
void XViewer::View16()
{
    View(16);
}

void XViewer::View(int count)
{
    qDebug() << "View" << count;
    // 2X2 3X3 4X4
    //确定列数 根号
    int cols = sqrt(count);
    //总窗口数量,和count区分,表示当前仅显示的数量
    int wid_size = sizeof(cam_wids) / sizeof(QWidget*);

    //初始化布局器
    auto lay = (QGridLayout*)ui.cams->layout();//当前布局转为网格布局
    if (!lay)//如果没有布局则重新创建一个网格布局
    {
        lay = new QGridLayout();
        lay->setContentsMargins(0, 0, 0, 0);
        lay->setSpacing(2);//元素间距
        ui.cams->setLayout(lay);//创建网格布局
    }
    //初始化窗口
    for (int i = 0; i < count; i++)
    {
        if (!cam_wids[i])
        {
            cam_wids[i] = new QWidget();
            cam_wids[i]->setStyleSheet("background-color:rgb(51,51,51);");
        }
        lay->addWidget(cam_wids[i], i / cols, i % cols);
    }

    //清理多余的窗体
    for (int i = count; i < wid_size; i++)
    {
        if (cam_wids[i])
        {
            delete cam_wids[i];
            cam_wids[i] = nullptr;
        }
    }
}

void XViewer::contextMenuEvent(QContextMenuEvent* event)
{
    //鼠标位置显示右键菜单
    left_menu_.exec(QCursor::pos());
    event->accept();
}

/
/// 鼠标拖动窗口

static bool mouse_press = false;
static QPoint mouse_point;//鼠标的坐标
void XViewer::mouseMoveEvent(QMouseEvent* ev)
{
    if (!mouse_press)
    {
        QWidget::mouseMoveEvent(ev);
        return;
    }
    this->move(ev->globalPos() - mouse_point);//鼠标在移动的过程中执行

}
void XViewer::mousePressEvent(QMouseEvent* ev)
{
    if (ev->button() == Qt::LeftButton)
    {
        mouse_press = true;
        mouse_point = ev->pos();
    }
}
void XViewer::mouseReleaseEvent(QMouseEvent* ev)
{
    mouse_press = false;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值