QT实现控件自动适合窗口大小

原创文章转载请注明:http://emouse.cnblogs.com

常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。

Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。

image

我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。

要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。

image

这部分具体的参数解释摘录如下:

结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。

控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:

A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以

放大。

C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小

的允许尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小

E. Expandint:控件可以自行增大或者缩小

注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)

所以对于需要根据窗口大小对应改变的部件我这里就设置为Expandint。

在部件大小策略的下方还有伸缩因子的设置,用于设置窗口部件在伸缩过程中的对应比例,这部分可以自行摸索。

要想实现随着窗口自动缩放,很重要的一点是需要设置顶级布局,对于一个窗口来说,只能有一个布局成为它的顶级布局,而刚刚的设置还只是控件之间的布局,因此需要放入窗体布局中进行布局。

在没有控件的地方右击-布局-在状体布局中布局,如下图所示:

image

接下来把需要布局的布局拖放到窗体布局中,这儿可以在右侧对象中选择,然后将控件向上拖入红框中(发现这一步不做也可以,直接进行下一步,不清楚在窗体布局中布局这项是啥区别),最后再在窗体没有控件出右击-布局-选择水平或者垂直布局(因为我之前已经是栅格布局了,相当于只有一个整体布局,因此这里选择哪一个没有区别)下图是操作前后对象窗口的对比。

imageimage

布局完成后效果如下:

image

到这儿,窗体就可以自由缩放了,由于我这里是使用label控件显示图像,因此窗体大小调整,图像会自动调整。

总结:一开始绕弯主要在两个地方,一个是控件的SizePolicy属性设置,二是一定要设置顶级布局。

Qt中,创建自定义控件并使其跟随父窗口大小变化通常是通过处理`QObject`的`QSizeEvent`和`QResizeEvent`信号来实现的。当你需要一个控件在父窗口调整大小时保持其相对于父窗口的比例或位置不变时,可以这样做: 1. **信号和槽连接**: - 在自定义控件的头文件中声明将接收事件的槽函数,如: ```cpp public slots: void resizeEvent(QResizeEvent *event); ``` - 在源文件中实现这个槽函数: ```cpp void CustomWidget::resizeEvent(QResizeEvent *event) { // 重绘或调整控件尺寸和位置的逻辑 } ``` 2. **响应大小变化**: - 当接收到`QResizeEvent`时,你可以获取到新的父窗口大小,然后更新控件的尺寸或布局: ```cpp QSize oldSize = this->size(); QWidget::resize(event->size()); // 如果控件有固定的大小比例,可以计算新的尺寸 QSize newSize = oldSize * (event->size().height() / event->oldSize().height()); setGeometry(newRect()); ``` 3. **使用约束布局**: - 使用Qt的QLayout或约束布局(例如`QFormLayout`, `QHBoxLayout`或`QVBoxLayout`),可以自动调整控件大小,而无需手动处理每个事件。 4. **保持相对位置**: - 确保控件在调整大小时,其内部元素(如果有的话)的位置不会丢失,可以通过设置控件的`setAlignment`属性来实现。 **相关问题--:** 1. 如何在Qt中使用约束布局实现随父窗体大小变化? 2. 在自定义控件中,如何避免控件内容被裁剪或重叠? 3. 如果需要在调整大小的同时保持某个固定比例,应该如何操作?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值