【Qt】实现在窗口缩放时控件维持相对位置
文章目录
- 01. 背景
- 02. 解决方案
- 03. 位置和大小的计算
- 03.1. 控件宽度或高度始终与窗体一致
- 03.2. 控件左右居中
- 03.3. 控件上下居中
- 03.4. 控件位于窗体右上角
- 03.5. 控件位于左右居中线向右30像素的地方
- 04. 完成效果
- 05. 经验教训
01. 背景
在Qt中,窗体里的控件默认不会随着窗口缩放而改变位置和大小。
然而,在很多时候,我需要一些控件保持居中,而另一些随窗口放大。
对于这个需求,网上常见的解决方案是设置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. 完成效果
假设我有一个搜索引擎:
05. 经验教训
如果在构造函数里用了
resize
函数来设置窗体大小,那么在窗口被打开的时候就会触发resizeEvent
。在这种情况下可以尝试直接把对于控件geometry的设置写在resizeEvent
中。在自己写表达式的时候,最好把控件初始的位置和大小与窗口的初始大小带进表达式里算一遍,如果没有问题,可以再尝试带入不同的窗口大小,以考虑不同的情况。
如果窗体缩的太大或者太小,控件无论怎么摆都不好看,所以建议用
setMaximumSize
和setMinimumSize
为窗口设置最大和最小的尺寸。如果只想实现简单的功能,可以直接用
setFixedSize
为窗口设置一个固定的尺寸,这样最方便。
【Qt】实现在窗口缩放时控件维持相对位置相关推荐
- 探究MFC之Dialog窗口最大化时控件自适应
探究MFC之Dialog窗口最大化时控件自适应 MFC的Dialog程序,在窗口最大化时,如何所有让子窗口(控件)按比例放大? 启动VisualC++6.0,New->MFC AppWizard ...
- qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...
前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...
- qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形
引言 创建一个基于QDialog的项目,自动生成ui文件,此时再添加新文件,创建一个基于QWidget的ui类,此类具有自定义标题栏,让该自定义类显示在窗口Dialog上,一开始具有红色的边框线,且四 ...
- Qt学习之显示类的控件(QLabel、QTextBrowser、QGraphicsView、QCalendarWidget、QWebView、QProgressBar、QOpenGLWidget)
本文转自:<Qt编程指南> 作者:奇先生 Qt编程指南,Qt新手教程,Qt Programming Guide 5.5 显示类的控件 本节显示类控件是指作为显示用途的控件,本 ...
- Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件
Qt安装事件过滤器.过滤子控件事件.截获控件按键.鼠标事件 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理. 假设我们有一个C ...
- windows常见窗口样式和控件风格以及类样式
Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...
- Windows常见窗口样式和控件风格
Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...
- android控件触摸缩放,Android控件之ZoomControls缩放使用
先看一下效果 正常 缩小 放大 一.简介 ZoomControls是一组可缩放的控件.它包含俩个按钮(放大按钮.缩小按钮) 二.重要方法 hasFocus():判断焦点 hide():隐藏 onTou ...
- html5 比例尺,高德地图API之缩放比例尺控件+3D转换
缩放比例尺控件 首先引入控件 amap.scale 然后使用 map.addcontrol() 添加控件 map *{margin:0;padding:0;list-style: none;} #co ...
最新文章
- java 有没有类似于 requests 爬虫_大数据时代,怎么能不了解“爬虫”是什么?
- Grunt的配置和使用
- 【十大经典排序算法】java实现--冒泡排序(1)
- 安装vue脚手架创建项目
- jvm堆空间的常用参数设置
- python可以调用windows资源吗_在Windows中使用Python设置文件夹权限
- 国产手机的安全漏洞或比勒索病毒还可怕?
- windows 监控
- 论文笔记_知名期刊与会议_CV_SLAM_3D Reconstruction
- Atitit 外观ui调整法 表单与表格列表
- Java集合Collection之实现原理解读(ArrayList)
- jetson用什么编译器_TK1入门教程软件篇-安装Nsight
- (知乎)男生 25 岁了,应该明白哪些道理?
- pygame中的mixer(含music)模块
- 带数据库html5游戏教程,html5学习之旅-html5的简易数据库开发(18)-H5教程
- 移动硬盘不在计算机显示,Win7移动硬盘在电脑上不显示怎么办?移动硬盘不显示盘符的解决办法...
- 软件配置管理中基线(baseline)
- opencv-python实际演练(二)军棋自动裁判(1)棋子图像采集设备DIY
- 热门应用借微信玩花样:一大波红包正在来袭
- 利用二进制位求平均值