【Qt】实现在窗口缩放时控件维持相对位置

2023-11-17

01. 背景

在Qt中,窗体里的控件默认不会随着窗口缩放而改变位置和大小。
拉跨.gif

然而,在很多时候,我需要一些控件保持居中,而另一些随窗口放大。

对于这个需求,网上常见的解决方案是设置Size Policy,经过尝试后我发现这种方法并不尽如人意。因此,我决定找到一个替代的解决方案。

02. 解决方案

我的解决方案是,重写Qt中的resize事件。

头文件加入以下代码:

protected:
    void resizeEvent(QResizeEvent *);

同时在源文件中写一个resizeEvent:


void SearchWin::resizeEvent(QResizeEvent *)
{
	int currentW = this -> size().width(); // 用以记录当前窗体宽度
	int currentH = this -> size().height(); // 用以记录当前窗体高度
	// 在这里插入一些重新设置控件大小的代码
}

在源文件的resizeEvent中,我根据位置和大小需求,为每个控件都写了一个setGeometry函数,里面把固定的数字替换成了一个计算表达式。

P.S. 因为在最开始的构造函数里面我用了this -> resize来设置窗口大小,窗体一显示就触发了resizeEvent,因此直接把控件的geometry写在了resize事件里面。

03. 位置和大小的计算

位置和大小的计算表达式因需求而异,这里提供几种我个人常用的几种思路,都很简单,希望能给大家一些启发:

03.1. 控件宽度或高度始终与窗体一致

w i d t h = 当 前 窗 体 宽 度 h e i g h t = 当 前 窗 口 高 度 width = 当前窗体宽度\\height = 当前窗口高度 width=height=

03.2. 控件左右居中

x = ( 当 前 窗 体 宽 度 − 控 件 宽 度 ) ÷ 2 x = (当前窗体宽度 - 控件宽度) \div 2 x=()÷2

03.3. 控件上下居中

y = ( 当 前 窗 体 宽 度 − 控 件 高 度 ) ÷ 2 y = (当前窗体宽度 - 控件高度) \div 2 y=()÷2

03.4. 控件位于窗体右上角

x = ( 当 前 窗 体 宽 度 − 控 件 宽 度 ) y = 0 x = (当前窗体宽度 - 控件宽度) \\ y = 0 x=()y=0

03.5. 控件位于左右居中线向右30像素的地方

x = ( 当 前 窗 体 宽 度 − 控 件 宽 度 ) ÷ 2 + 30 x = (当前窗体宽度 - 控件宽度) \div 2 + 30 x=()÷2+30

04. 完成效果

假设我有一个搜索引擎:
舒服.gif

05. 经验教训

  • 如果在构造函数里用了resize函数来设置窗体大小,那么在窗口被打开的时候就会触发resizeEvent。在这种情况下可以尝试直接把对于控件geometry的设置写在resizeEvent中。

  • 在自己写表达式的时候,最好把控件初始的位置和大小与窗口的初始大小带进表达式里算一遍,如果没有问题,可以再尝试带入不同的窗口大小,以考虑不同的情况。

  • 如果窗体缩的太大或者太小,控件无论怎么摆都不好看,所以建议用setMaximumSizesetMinimumSize为窗口设置最大和最小的尺寸。

  • 如果只想实现简单的功能,可以直接用setFixedSize为窗口设置一个固定的尺寸,这样最方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt】实现在窗口缩放时控件维持相对位置 的相关文章

随机推荐

  • 前端三剑客---HTML&CSS&JavaScript

    HTML CSS JavaScript 1 HTML 1 1 介绍 1 2 快速入门 1 3 基础标签 1 3 1 标题标签 1 3 2 hr标签 1 3 3 字体标签 1 3 4 换行标签 1 3 5 段落标签 1 3 6 加粗 斜体 下
  • diagnose-tools 编译报错

    在 Ubuntu 20 04 4 LTS 环境中 编译diagnose tools 执行make deps时报错 checking whether gcc m32 makes executables we can run no config
  • ValueError: Buffer dtype mismatch, expected ‘unsigned char‘ but got ‘long‘

    在使用pydensecrf进行densecrf时出现ValueError def dense crf img probs n labels 2 h probs shape 0 w probs shape 1 probs np expand
  • NBA GLOSSARY

    NBA 全称 National Basketball Association 美国国家篮球协会 DRAFT draft dr ft n 选秀 R1 Round one 第一轮 St Vincent St Mary HS OH Saint V
  • electron-builder打包过程中报错——网络下载篇(转)

    在electron使用electron builder打包过程中需要用到几个github上的包 但是由于网络原因 会科学上网的同学基本不用看了 下载不下来 导致出错 一 electron v8 2 0 win32 x64 zip 如下图 导
  • MCP4725介绍和STM32模拟IC2驱动

    一 MCP4725 简单总结为下面几个特点 1路DAC输出 12位分辨率 I2C 接口 标准 快速 高速支持 供电电压2 7 5 5 内部EEPROM存储设置 I2C地址可配置 A0 A1 A2内置 默认为 00 二 硬件设计 MCP472
  • torch 测试GPU能否正常使用

    运行程序 import torch print torch cuda is available num gpu 1 Decide which device we want to run on device torch device cuda
  • 介绍D3DPOOL和Lock

    介绍D3DPOOL和Lock 分类 DirectX 2013 02 28 00 21 322人阅读 评论 0 收藏 举报 D3D RUTIME的内存类型 分为3种 VIDEO MEMORY VM AGP MEMORY AM 和SYSTEM
  • 最能感动女人的十大瞬间

    拉着手在街上闲逛 忽然之间 他将她拽停 伸手轻轻地将眼睑下的一根睫毛拨开 她顿感幸福 拨走睫毛不过是弹指之间的小事 却充分说明他对她的注意力100 集中 要不是他喜欢仔细地偷看她 怎能发现刚跌落的一根细小睫毛 没有一个女人 能够抵抗男人如此
  • Java爬虫框架WebMagic的使用总结

    最近 项目做一个公司新闻网站 分为PC 移动端 h5 数据来源是从HSZX与huanqiu2个网站爬取 主要使用Java编写的WebMagic作为爬虫框架 数据分为批量抓取 增量抓取 批量抓当前所有历史数据 增量需要每10分钟定时抓取一次
  • CSS3 弹性盒子(flex、flex-direction属性、flex-wrap属性、align-items属性、align-content属性)详解

    文章目录 flex flex direction 属性 flex wrap 属性 align items 属性 align content 属性的使用 flex 在 CSS3 中给 display 属性增加了新的属性值 flex 如果一个元
  • 关于MFC中使用ShellExecute出现的进程冲突问题

    目录 问题背景 问题分析 问题背景 现在有一个MFC写的界面程序 以及一个外部exe文件 用户通过界面选择文件a MFC将文件a的路径作为参数 调用exe文件生成一个解析文件b 然后MFC再读取这个文件b 为了完成这一目的 就需要在MFC中
  • Airtest IDE 使用方法

    1 assert exists 找到图片则返回图片坐标 否则报错 raise AssertionError 引发断言错误 2 assert not exists 没找到图片则返回None 否则报错 raise AssertionError
  • 项目实战——文档扫描OCR识别

    扫描全能王的实现 maybe 目录 一 文档扫描 1 引入所需要的库 2 图像的读取与预处理 读取图像 图像reszie 图像灰度化 滤波 边缘检测 3 轮廓检测 4 透视与二值变换 二 文字识别 一 文档扫描 文档扫描所实现的功能如下图所
  • 【转载】浅谈蓝牙 Mesh 组网技术

    本文转载自 Eren https www erenship com posts 63c7 html 蓝牙技术联盟官方网址 https www bluetooth com zh cn 蓝牙技术联盟公众号 BluetoothSIG 蓝牙技术联盟
  • BIO与NIO、AIO的区别

    IO的方式通常分为几种 同步阻塞的BIO 同步非阻塞的NIO 异步非阻塞的AIO 一 BIO 在JDK1 4出来之前 我们建立网络连接的时候采用BIO模式 需要先在服务端启动一个ServerSocket 然后在客户端启动Socket来对服务
  • 使用Nuget 安装指定版本package或者更新package到指定版本

    首先打开程序包管理器控制台 工具 Nuget程序包管理器 程序包管理器控制台 打开如下图所示的命令行界面 安装指定版本的Package 例如 EntityFramework 5 0 PM gt Install Package BenchMa
  • 关于yolov5训练大量数据存在的问题记录

    相关配置环境 拉取官方最新的镜像 docker pull ultralytics yolov5 以及代码 git clone https github com ultralytics yolov5 torch 1 10 1 cu102 CU
  • 小程序requiredPrivateInfos 无效以及闪退问题

    原生微信小程序踩坑 requiredPrivateInfos 无效 1 检查单词拼写是否正确以及是否有空格存在 2 检查是否在微信公众平台中申请了权限 3 将多行改为一行 requiredPrivateInfos xxxxxxx xxxx
  • 【Qt】实现在窗口缩放时控件维持相对位置

    文章目录 01 背景 02 解决方案 03 位置和大小的计算 03 1 控件宽度或高度始终与窗体一致 03 2 控件左右居中 03 3 控件上下居中 03 4 控件位于窗体右上角 03 5 控件位于左右居中线向右30像素的地方 04 完成效