首页 > 其他分享 >Qt父窗口处理子窗口大小变化消息installEventFilter

Qt父窗口处理子窗口大小变化消息installEventFilter

时间:2024-12-24 15:53:53浏览次数:3  
标签:installEventFilter 窗口 Qt ui reso 宽高比 播放 widgetSize

1.需求描述

父窗口从上到下时标题栏,播放窗口和工具栏,希望监测中间播放窗口的大小变化,来根据分辨率自动调整播放画面的宽高;因为工具栏和标题栏可以隐藏,所以父窗口大小不变,中间的播放窗口也会随着工具栏和标题栏隐藏而变大,所以父窗口的resize函数无法检查到这种情况下播放窗口的大小变化,所以不能在父窗口大小变化时处理按分辨率自适应画面宽高比。需要用中间播放窗口的大小变化触发按分辨率自适应画面宽高比;

2.实现方法

采用installEventFilter函数,在父窗口playwnd的类中添加子窗口的事件消息过滤器来接收并处理子窗口的大小变化消息;

在父窗口playwnd的构造函数中,调用子窗口的ui.widgetPlayContain的函数installEventFilter,传入父窗口指针this,表示在父窗口中处理子窗口的事件消息

ui.widgetPlayContain->installEventFilter(this);

playwnd中重写虚函数eventfilter,过滤处理子窗口widgetPlayContain的消息,eventFilter是虚函数,会自动过滤被观察者的事件消息

bool PlayWnd::eventFilter(QObject *watched, QEvent *event)
{
    if (watched==ui.widgetPlayContain)//判断是否是播放窗口
    {
        if (event->type() == QEvent::Resize)//判断是否是大小变化消息
        {
            ResizePlayWndByResolution();//根据分辨率和窗口的宽高,自适应播放画面的宽高比
        }
        
    }
    return QWidget::eventFilter(watched, event);
}

3.根据监控点或者视频的分辨率自适应调整播放画面的宽高比

视频的分辨率宽高比和播放窗口的宽高比例不一定相同,播放时如果填充整个播放窗口,会出现播放画面横向或纵向拉伸以填充整个窗口,这样会导致播放画面变形或者不协调,影响观看效果;为了保持视频的按照原来的宽高比,可以根据视频的分辨率的宽高比调整播放画面的宽高比,这样就保证画面不变形拉伸;

实现思路,用两个widget,外层widgetPlayContain,内层widgetPlay是播放画面,用widgetPlayContain的布局layout的边距去控制中间widgetPlay的宽高比和视频分辨率宽高比相同,这样可能是左右有边距,上下无边距,或者上下有边距,左右无边距

void PlayWnd::ResizePlayWndByResolution()
{
    if (m_pHandle == NULL || m_PlayState != PLAYING)
    {
        ui.vLayoutPlayContain->setContentsMargins(0, 0, 0, 0);
        return;
    }
    if (CLocalSystemConfigManager::Instance().GetInformationDisplayConfig().image_display==OriginalResolution)
    {
        playsdk::ResolutionParam reso;
        int ret = GetResoution(m_pHandle, reso);
        if (ret == 0)
        {
            QSize widgetSize = ui.widgetPlayContain->size();
            //用窗口的高度按照分辨率的比例算出宽度
            int width = widgetSize.height()*reso.iWidth / reso.iHeight;
            if (width > widgetSize.width())//宽度不够,按照窗口最大宽度填充,缩小高度,上下有边距
            {
                //根据宽度计算出播放窗口高度
                int height = widgetSize.width()*reso.iHeight / reso.iWidth;
                int updownmargin = (widgetSize.height() - height) / 2;
                ui.vLayoutPlayContain->setContentsMargins(0, updownmargin, 0, updownmargin);
            }
            else//宽度够,按照窗口最大高度填充,高度已知,宽度缩小,左右有边距
            {
                int width = widgetSize.height()*reso.iWidth / reso.iHeight;
                int leftrightMargin = (widgetSize.width() - width) / 2;
                ui.vLayoutPlayContain->setContentsMargins(leftrightMargin, 0, leftrightMargin, 0);
            }
        }
        else
        {
            LOG_ERROR("GetResoution failed %d", ret);
        }
    }
    else
    {
        ui.vLayoutPlayContain->setContentsMargins(0, 0, 0, 0);
    }
    
}

 

标签:installEventFilter,窗口,Qt,ui,reso,宽高比,播放,widgetSize
From: https://www.cnblogs.com/bclshuai/p/18627870

相关文章

  • QT使用状态机实现qml页面切换配置化
    1.首先创建配置文件(JSON格式)://states_config.json{"states":[{"name":"InitState","qmlPath":"qrc:/qml/InitPage.qml","transitions":[{......
  • 嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
    此项目是基于人脸识别的考勤系统开发,包括如下模块:1、人脸识别考勤系统GUI界面设计,包括:(1)Qt环境(window环境/linux环境);(2)Qt工程创建分析;(3)Qt基本组件QwidgetQMainWindow,Qdialog,QLineEdit,Qlabel,QPushButton;(4)Qt界面布局,设计人脸识别考勤系统界面搭建;(5)考勤机界面设计(考勤......
  • SQL 实战:窗口函数的妙用 – 分析排名与分组聚合
    在复杂的数据分析和查询场景中,SQL窗口函数(WindowFunctions)是提升性能和代码可读性的重要工具。窗口函数可以轻松实现排名、分组聚合、滑动平均等复杂计算,避免使用嵌套子查询或冗余的多次表扫描。本文将通过实战案例,深入剖析窗口函数的应用场景,重点讲解如何进行排名和分组......
  • Linux中设置终端窗口大小
    本章目录本次示例以Ubuntu为例:Ctrl+Alt+T先打开一个终端设置行列大小,重启终端生效:同理,此处也可设置字体、颜色等其它属性,可自由选择,希望对你有帮助;本次示例以Ubuntu为例:Ctrl+Alt+T先打开一个终端设置行列大小,重启终端生效:同理,此处也可设置字体、颜色......
  • Qt编程快速入门(1)Qt结构简介
    Qt构成Qt(/ˈkjuːt/,发音同“cute”)是一个跨平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,例如控制台工具和服务器。-摘自维基百科Qt可以在多个平台编译运行,包括Windows、Linux、MacOS,其运行时的表现取决于操作系统的U......
  • VScode + cmake编写Qt程序
    本机环境Ubuntu20.04Qt5.12.81.安装Vscode直接在官网下载对应的deb包安装即可。下载后在deb包所在目录执行如下命令安装deb包。sudodpkg-i安装包名.deb然后在应用程序中应该就有了Vscode的图标了。2.安装cmake与gccg++先安装cmakesudoapt-getinstall......
  • QTreeView + 自定义json模型
    QTreeView使用自定义json模型前言QTreeView+自定义json模型QTreeView使用自定义json模型支持节点插入删除二、代码//QJsonModel.h#ifndefQJSONMODEL_H#defineQJSONMODEL_H#include<QAbstractItemModel>#include<QJsonDocument>#include<QJsonObject>#i......
  • raylib U1S02、在窗口上画小圆球
    这篇笔记我们实现在窗口上画上几个小球,然后让小球反弹运动的功能。分成两个部分:第一部分简单说一下基本原理第二部分讲实现代码。不喜欢看原理的同学可以直接跳到第二部分去。原理简单地理解,我们在计算机上看到的所有画面,都是计算机渲染出来的一个个图片,这些图片在屏幕上一......
  • Qt编写机器码秘钥控制/日期防篡改/离线使用/硬件标识/运行时间/数量控制/批量更新秘钥
    一、前言说明搞软件开发一直追求精益求精的目标,从第一版的秘钥生成器到今天这个版本,经历了十年的时间,最初的版本做的非常简陋,就是搞了个异或加密,控制运行时间,后面又增加设备数量的控制,然后就是到期时间的限制。这种有个巨大缺陷就是可复制性,如果将授权的秘钥文件,拷贝到其他电脑也......
  • 双指针解题(滑动窗口)
    概念滑动窗口属于双指针,因为左右两指针同向移动,像窗口移动而得名.练习题目长度最小的子数组209.长度最小的子数组-力扣(LeetCode)思路只要左右区间对应值之和小于目标值,则直接入窗口(即right++),且将sum加上入窗口的值;当左右区间的对应值之和大于等于目标值,则直接出窗口......