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

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为窗口设置一个固定的尺寸,这样最方便。

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现Qt中UI界面中的控件窗口缩放而等比例缩放,可以使用布局管理器来自动调整控件的大小和位置。布局管理器可以根据窗口的大小和变化自动调整内部控件的尺寸和位置,从而实现自适应布局。 以下是一种常见的方法,可以让UI界面中的控件窗口缩放等比例缩放: 1. 在Qt Designer中,选择主窗口或父容器窗口(例如QDialog),右键单击并选择"布局"->"布局管理器"->"垂直布局"(或水平布局)。 2. 将要自动缩放控件放置在布局管理器中。 3. 对于每个控件,您可以选择其大小策略(如保持原始大小、拉伸等)和拉伸因子。 - 对于保持原始大小的控件,将其大小策略设置为"Preferred"(或不进行设置),这样它们将保持原始大小而不会缩放。 - 对于需要拉伸的控件,将其大小策略设置为"Expanding",并根据需要设置拉伸因子。 4. 保存并生成UI文件。 在运行,当窗口的大小发生变化,布局管理器将自动调整内部控件的大小和位置,以使它们保持相对窗口的比例。这样,UI界面中的控件就可以随窗口缩放而等比例缩放了。 请注意,这种方法适用于使用Qt Designer创建的UI界面。如果您是通过编程方式创建UI界面,您可以使用QLayout类和其子类(如QVBoxLayout、QHBoxLayout等)来手动管理布局,并设置控件的大小策略和拉伸因子。 希望对您有所帮助!如果还有其他问题,请随提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值