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