无标题栏的Qt子窗体在父窗体中停靠时,如何做到严丝合缝

news2025/1/24 8:26:08

目录

1. 问题的提出

2. 一般实现

3. 加强版


1. 问题的提出

       由于业务的要求,需要从父窗体弹出一个子窗体,该子窗体无标题栏,且该子窗体要停靠到父窗体右下角。这个看似很容易的问题,细研起来其实不容易!

2. 一般实现

        通常用如下代码为窗体设置无标题栏:

setWindowFlags(Qt::FramelessWindowHint);

下面代码,在CUavGuarMainWnd窗体创建了子窗体m_pFunOperPanel,

#include "uavguarmainwnd.h"
#include "ui_uavguarmainwnd.h"
#include "funoperpanel.h"
CUavGuarMainWnd::CUavGuarMainWnd(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::CUavGuarMainWnd)
{
      m_pFunOperPanel = new CFunOperPanel(this);
}

为了简约,在此不列出.h文件。其中m_pFunOperPanel为CFunOperPanel类对象的指针,其为CUavGuarMainWnd的成员变量。为了将m_pFunOperPanel停靠到CUavGuarMainWnd窗体的右下角,一般会写出如下代码:

void CUavGuarMainWnd::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);

    auto nWidth = m_pFunOperPanel->width();
    auto nHeight = m_pFunOperPanel->height();
 
    m_pFunOperPanel->move(width() - nWidth, height() - nHeight);

}

上面的代码很简单,就是响应父窗体的resizeEvent事件,从而将子窗体m_pFunOperPanel移动到父窗体的右下角,效果如下:

从上图可以看到,子窗体在停靠时,子窗体底边没有完全挨着父窗体的底边,还存在不小的间隙呢!!!如何让子窗体的底边完全挨着父窗体的底边,做到严丝合缝?

3. 加强版

      造成第2节提到的问题的原因是:开发人员以为窗体去掉了标题栏,标题栏就不占据平面区域了。这肯定是错误的,在解决这个问题之前,需要明确如下3点:

  • 窗体虽然去掉了标题栏,但标题栏依然占据宽度和高度,即依然占据平面区域,故要减去标题栏高度,而标题栏的高度是通过QStyle::PM_TitleBarHeight 枚举常量表示的。
  • 如果窗体去掉了标题栏,则边框也去掉了,故也要减去边框厚(高)度。标题栏和边框是两种不同的东西,不要认为标题栏包含了边框。QStyle::PM_DefaultFrameWidth枚举常量就是表示边框厚(高)度)。
  • 子窗体高度即本例的如下代码:
auto nHeight = m_pFunOperPanel->height();

返回的窗体高度值包含了标题栏和边框厚(高)度,由于Qt窗体默认的坐标系是Y轴向下,故去掉标题栏和边框厚(高)度,反应到程序上是加上这两个值。按此分析,更改2节代码,如下:

void CUavGuarMainWnd::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);

    auto nWidth = m_pFunOperPanel->width();
    auto nHeight = m_pFunOperPanel->height();
    auto yPos = height() - nHeight + QStyle::PM_TitleBarHeight + QStyle::PM_DefaultFrameWidth;
    m_pFunOperPanel->move(width() - nWidth, yPos);

}

注意,在cpp文件的顶部需要加入如下头文件:

#include<QStyle>

效果如下:

可以看到:子窗体底边完全挨着父窗体的底边,严丝合缝了。

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

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

相关文章

维基百科是非营利性机构 词条内容具有中立性、准确性、可靠性

维基百科对一些企业很有神秘性&#xff0c;自行操作很多次也没有成功建立维基百科&#xff0c;这一定是没有按照维基百科的规则和流程去操作。小马识途营销顾问提醒企业&#xff0c;维基百科是一种基于协作的在线百科全书&#xff0c;由维基媒体基金会运营。维基百科的创建流程…

内涝积水设备推荐,城市易涝点怎么监测?

随着城市化逐步发展&#xff0c;城市内涝问题越来越多且越来越严重&#xff0c;给人们的出行和生活带来很多的不便。为了解决这一问题&#xff0c;内涝积水监测仪受到越来越受到关注。 内涝积水设备能够实时监测道路积水情况&#xff0c;包括积水深度等信息&#xff0c;为相关人…

nodejs+vue公益帮学网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。为确保中国经济的持续发展&#xff0c; 如何用方便快捷的方式使管理者在广阔的数据海洋里面查询、存储、管理和共享有效的数据信息&#xff0c;对我们的学习&#xff0c;工作和生活具有重要的现…

μC/OS-II---计时器管理2(os_tmr.c)

目录 获取计时器的名字获取计时器到期前剩余的时间查看计时器的状态 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;例…

vue 事件总线 非父子组件之间的简单信息传递

如果两个组件不是父子关系&#xff0c;那么传递信息就不能通过props了。 此时可以使用vue的事件总线来传递信息。 1.创建非父子组件都能访问的事件总线&#xff08;也就是空的vue实例&#xff09; 1.创建一个EventBus.js 2.引入vue并且创建一个vue实例 import Vue from vuec…

微信小程序 解决tab页切换过快 数据出错问题

具体问题&#xff1a;切换tab页切换过快时,上一个列表接口未响应完和当前列表数据冲突 出现数据错误 具体效果如下&#xff1a; 解决方式&#xff1a;原理 通过判断是否存在request 存在中断 并发送新请求 不存在新请求 let shouldAbort false; // 添加一个中断标志 let re…

STM32 LED编程 GPIO的初始化(标准库)

实验的电路图介绍 实验的电路图类似于开漏接法 要初始化GPIOC接口 标准库的模板 GPIO的标准库编程接口 GPIO引脚的初始化 GPIO作为片上外设 每一个片上外设使用前一定要使能时钟 为什么要使能时钟&#xff1f;时钟是啥 时钟的使能 stm32的每一个片上外设都是时序电路 时序…

计算机视觉基础(6)——光流估计

前言 本章我们来学习一下图像处理基础中的运动估计。主要内容包括运动场估计和光流估计两个部分。在运动场估计中&#xff0c;我们将学习到运动场、光流、光流和运动场的区别&#xff1b;在光流估计中&#xff0c;我们将学习到光流估计任务、孔径问题&#xff0c;以及光流估计两…

高质量实时渲染笔记

文章目录 Real-time shadows1 自遮挡问题2 解决阴影detach问题&#xff1f;3 Aliasing4 近似积分5 percentage closer soft shadows(PCSS)percenta closer filtering(PCF)PCSS的思想 6 Variance Soft Shadow Mapping (VSSM)步骤Moment Shadow Mapping 7 Distance field shadow …

MongoDB入门级别教程全(Windows版,保姆级教程)

下载mongodb 进入官网&#xff1a; Download MongoDB Community Server | MongoDB 选择msi&#xff0c;Windows版本 下载完后直接双击&#xff1a; 选择complete 这里建议改地方&#xff1a; 我这里直接改成d盘&#xff1a;work目录下面&#xff1a; 点击next&#xff1a; 因…

C 语言实现 UDP

广播 发送广播信息&#xff0c;局域网中的客户端都可以接受该信息 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd socket(PF_INET, …

MySQL 社区开源备份工具 Xtrabackup 详解

文章目录 前言1. Xtrabackup 介绍1.1 物理备份与逻辑备份区别1.2 Xtrabackup 系列版本 2. Xtrabackup 部署2.1 下载安装包2.2 二进制部署2.3 程序文件介绍2.4 备份需要的权限 3. Xtrabackup 使用场景3.1 本地全量备份3.2 本地压缩备份3.3 全量流式备份3.3.1 备份到远程主机3.3.…

技术架构 - 应用数据分离,应用服务集群架构

前言 上一篇文章介绍了单机架构&#xff0c;由于性能瓶颈&#xff0c;满足不了高访问量&#xff0c;所以演化出了数据分离架构。 这种架构也很简单只是将应用服务和数据库服务分离开来&#xff0c;避免单一架构的资源争夺的情况。 一、 应用数据分离架构 1. 简介 应用服务和…

JavaScript从入门到精通系列第三十七篇:详解JavaScript中文档的加载顺序

文章目录 一&#xff1a;文档加载说明 1&#xff1a;回顾一个代码 2&#xff1a;问题分析和说明 二&#xff1a;如何给JS换个位置&#xff1f; 1&#xff1a;过程分析 2&#xff1a;代码编写 3&#xff1a;运行结果 4&#xff1a;解释说明 大神链接&#xff1a;作者有幸…

Excel-lookup函数核对两个表格的数据匹配

需求描述&#xff1a;把右侧表格里的成绩按照姓名匹配到左表中 D11函数为LOOKUP(1,0/($H$11:$H$26A11),I$11:I$26) 然后下拉赋值公式&#xff0c;那么得到的值就都是对应的

Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享

2021年12月入手一台Moto Edge S Pro 12256版&#xff0c;看着性价比很高&#xff0c;越用越垃圾。屏幕显示没有vivo亮丽/APP图标很丑/屏幕上一点点水就失灵/拍照片边缘是模糊的/系统几乎不更新。 以上都可以忍受&#xff0c;但是&#xff1a; 用一年不到&#xff0c;蓝牙不能…

2024 AIGC 规划:探索交互体验变革及 智能硬件基础设施篇

TL;DR Run LLM/Embedding on Android: https://github.com/unit-mesh/android-semantic-search-kitInference SDK&#xff1a;https://github.com/unit-mesh/inference 正文&#xff1a; 在过去的一年时间里&#xff0c;国内外大中型公司都在探索、引入了 GenAI / AIGC&#xf…

Linux使用Docker完整安装Superset,同时解决please use superset_config.py to override it报错

文章目录 Docker安装Superset流程1. 首先获取镜像2. 生成SSL3. 创建Superset容器4. 更新数据库5. 测试访问Superset Docker安装Superset流程 1. 首先获取镜像 docker pull amancevice/superset2. 生成SSL 接下来我们运行一些额外的程序&#xff1a; openssl rand -base64 4…

数字媒体技术基础之:常见图片文件格式

在数字图像处理和图形设计领域&#xff0c;了解不同的图片文件格式及其特点是至关重要的。每种格式都有其独特的用途和优势。以下介绍一些最常见的图片文件格式。 JPEG Joint Photographic Experts Group 扩展名&#xff1a;.jpg 或 .jpeg 特点&#xff1a; 1、有损压缩&#x…

uni-app报错“本应用使用HBuilderX x.x.x 或对应的cli版本编译,而手机端SDK版本是x.x.x不匹配的版本可能造成应用异常”

uniapp开发的一个跨平台软件&#xff0c;在安卓模拟器上启动的时候报警告&#xff1a; 官方给的解释&#xff1a;uni-app运行环境版本和编译器版本不一致的问题 - DCloud问答 解决办法有两个 方法一&#xff1a;添加忽略警告的配置 项目根目录下找到 manifest.json&#xf…