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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

策略模式以及优化

使用场景 在一个条件语句中又包含了多个条件语句 具体策略类会过多 把抽象策略和具体策略放在一个枚举类里。 方法 exe() 相当于抽象策略,而A和B就相当于实现了抽象策略的具体策略 这样就只需要一个枚举类就可以解决具体策略类过多的问题 public enum Strategy {A{O…

17_HTML5 Web 存储 --[HTML5 API 学习之旅]

HTML5 Web 存储(Web Storage)是 HTML5 引入的一种在用户浏览器中存储数据的机制。它提供了比传统的 cookies 更加方便和强大的功能,包括更大的存储空间、更好的性能以及更简单的 API。Web 存储主要分为两种类型:localStorage 和 s…

Java处理视频思路

1.首先实现断点续传功能。 断点续传实现思路: 前端对文件分块。前端使用多线程一块一块上传,上传前给服务端发一个消息校验该分块是否上传,如果已上传则不再上传。如果从该断点处断网了,下次上传时,前面的分块已经存在…

RealityCapture导入视频序列失败

问题原因:如果导入的视频文件存在多余的元数据,那么在这里会发生导入失败。 以本人华为手机拍摄的一段.mp4视频为例: 利用ffmpeg在窗口命令行中检查你的视频—— ffmpeg -i your_video_name.mp4your_video_name是你的视频文件名 如下图所示&…

Windows下Python+PyCharm的安装步骤及PyCharm的使用

Windows下PythonPyCharm的安装步骤及PyCharm的使用 文章目录 Windows下PythonPyCharm的安装步骤及PyCharm的使用一、Python的安装(1)环境准备(2)Python安装(3)pip组件的安装 二、PyCharm的安装(…

khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像

khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像 一、资源准备1.1 镜像文件1.2 刷机工具1.3 ubuntu20.04 docker镜像(具备demon无人机所需各种驱动) 二、开始刷机(安装ubuntu22.04系统)2.1 进入刷机状态2.2 刷机 三、docker…

ASP.NET |日常开发中常见问题归纳讲解

ASP.NET |日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态(在ASP.NET Web Forms 中) 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击(XSS) 三、状态管理问题3.1 会话状态(Session …

基础爬虫案例实战

我们已经学习了多进程、requests、正则表达式的基本用法,但还没有完整地实现过一个爬取案例。这一节,我们就来实现一个完整的网站爬虫,把前面学习的知识点串联起来,同时加深对这些知识点的理解。 准备工作 我们需要先做好如下准备工作。 安…

JAVA: 子类“覆盖”父类的成员变量

参考:JAVA: 子类“覆盖”父类的成员变量_子类覆盖父类成员变量-CSDN博客 public class Person {static String name "person";public String getName() {return name;}public void setName(String name) {this.name name;} }public class Dad extends …

Pandas08

Pandas01 Pandas02 Pandas03 Pandas04 Pandas05 Pandas06 Pandas07 文章目录 内容回顾同期群分析1.1 同期群分析概念1.2 案例代码 数据分析报告数据分析工作内容数据分析简历说明用户生命周期标签1 什么是生命周期标签2 如何计算生命周期标签 内容回顾 TGI 偏好分析 TGI 目标…

Linux 硬盘扩容 分区 挂载

Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb,后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘(2TB以上) gdisk /dev/sdb1.3. 编辑分…

Python einops库介绍

einops 是一个轻量级的 Python 库,提供了直观和灵活的张量操作方法。其核心功能包括重排(rearrange)、重塑(reshape) 和 归约(reduce),并通过简单的字符串表达式定义复杂的张量操作,适用于 Numpy、PyTorch、TensorFlow、JAX 等常用深度学习框架。 einops 的主要功能 …

Spring Boot 项目中 Maven 剔除无用 Jar 引用的最佳实践

目录 引言Maven 依赖管理的基础概念 2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机制 无用依赖的常见问题与影响剔除无用 Jar 引用的常见方法 4.1 识别无用依赖4.2 使用 Maven 的 dependency:analyze 插件4.3 配置 scope 以优化依赖范围4.4 使用 exclude 排除传递依赖4.5 分析…

Windows11家庭版 Docker Desktop 的安装历程

1.下面是 Docker Desktop 的官网下载地址 窗户 |Docker 文档 不出意外下载会很慢,下载好了先不安装 2.打开电脑的一些兼容程序 控制面板 -> 程序 -> 启用或关闭Windows功能 勾选下列兼容功能,有Hyper-v也勾上,不过我没有 3.下载WSL…

总结TCP/IP四层模型

总结TCP/IP四层模型 阅读目录(Content) 一、TCP/IP参考模型概述 1.1、TCP/IP参考模型的层次结构二、TCP/IP四层功能概述 2.1、主机到网络层  2.2、网络互连层  2.3、传输层  2.3、应用层 三、TCP/IP报文格式 3.1、IP报文格式3.2、TCP数据段格式3.3、UDP数据段格式3.4、套…

Apriori关联规则算法 HNUST【数据分析技术】(2025)

1.理论知识 Apriori是一种常用的数据关联规则挖掘方法,它可以用来找出数据集中频繁出现的数据集合。该算法第一次实现在大数据集上的可行的关联规则提取,其核心思想是通过连接产生候选项及其支持度,然后通过剪枝生成频繁项集。 Apriori算法的…

汽车网络安全基线安全研究报告

一、引言 随着汽车行业朝着智能网联方向飞速发展,汽车网络安全已成为保障用户安全和行业健康发展的关键要素。本报告将深入探讨汽车网络安全相关内容,以及国际、国内重要的汽车网络安全标准基线和相应防护措施等内容。 二、汽车网络安全的重要性 &…

机器学习2-NumPy

ndarray自动广播扩展维度,便于进行行列式,数组计算 # 自动广播机制,1维数组和2维数组相加# 二维数组维度 2x5 # array([[ 1, 2, 3, 4, 5], # [ 6, 7, 8, 9, 10]]) d np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) # c是一…

MyBatis动态 SQL 的执行原理

MyBatis 动态 SQL 是 MyBatis 框架中的一个重要特性,它允许开发者根据条件动态地生成不同的 SQL 语句。通过使用动态 SQL,开发者可以根据传入的参数动态地构建 SQL 查询,这样就避免了写多个 SQL 语句,提升了代码的灵活性和可维护性…

info There appears to be trouble with your network connection. Retrying

这个错误信息表明你在使用包管理器安装项目依赖时遇到了网络连接问题。 可能的解决方法: 检查当前node.js版本是否过低。 建议使用当前长期支持版本 yarn的淘宝镜像:yarn的淘宝镜像-CSDN博客 nvm常用命令:NVM常用命令-CSDN博客 下载 | Node.js 中文…