QT 布局,控件自适应大小 自动缩放 自动布局

目录

前言

1. 先来说简单的布局控件自适应

说明我们实现了自动布局;

3.通过代码设置控件自动缩放重写resizeEvent

4. 源码:https://upload.youkuaiyun.com/creation/uploadResources/86620882


前言

QT版本:Qt5.12.3(msvc2017_64)

有时,我们需要我们的布局或控件,随窗口变化而变化;这时就要求我们注意一下;

1. 先来说简单的布局控件自适应

首先拖动两个 verticalLayout 放到窗口;

 右击空白处;右键菜单 ->布局->栅格布局;

 可以看到已经有点会自动布局的样子;接着我们加入两个Label,Labe会自动占满一个布局;

我们设置Label 文字居中;

 上面是非全屏前显示;

上面是全屏后显示,位置依然是居中的;

说明我们实现了自动布局;

2.不是每个控件,都会自适应占整个父控件空间;有时我们也不需要它一直变大,可以通过以下属性设置大小;

结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。
控件的sizePolicy说明控件在布局管理中的缩放方式。下面列举了一些最长用的值:
a. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
b. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以放大。
c. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。
d. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小
e. Expanding:控件可以自行增大或者缩小
注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)
 

3.通过代码设置控件自动缩放重写resizeEvent

这样可以控件指定控件变化;

思路如下:

一、获取我们当前窗口宽高  m_oldWidth ,m_oldHeight 。
二、在resizeEvent  获取新宽高/旧的宽高,求出缩放比例。
用需要缩放的子控件乘 缩放值, 下面是获取所有窗口上的按钮与标签,进行缩放。

void MainWindow::resizeEvent(QResizeEvent *event)
{
    int Width = ui->centralWidget->width();
    int  Height = ui->centralWidget->height();

    float  scaleX = Width*1.0/m_oldWidth*1.0;
    float  scaleY = Width*1.0/m_oldWidth*1.0;
    QList<QPushButton*> buttonList = ui->widget->findChildren<QPushButton*>();
    for(auto it=buttonList.begin();it!=buttonList.end();it++)
    {
        int oldX = it.i->t()->x();
        int oldY = it.i->t()->y();
        int oldW = it.i->t()->width();
        int oldH = it.i->t()->height();
        it.i->t()->move(oldX*scaleX, oldY*scaleY);
        it.i->t()->resize(oldW*scaleX, oldH*scaleY);
    }
    QList<QLabel*>labelList = ui->widget->findChildren<QLabel*>();
    for(auto it=labelList.begin();it!=labelList.end();it++)
    {
        int oldX = it.i->t()->x();
        int oldY = it.i->t()->y();
        int oldW = it.i->t()->width();
        int oldH = it.i->t()->height();
        it.i->t()->move(oldX*scaleX, oldY*scaleY);
        it.i->t()->resize(oldW*scaleX, oldH*scaleY);
    }
    m_oldWidth = Width;
    m_oldHeight = Height;
}

4. 源码:https://upload.youkuaiyun.com/creation/uploadResources/86620882

推荐

 Qt 不规则窗口,不规则按钮,不规划控件 不规则界面_恋恋西风的博客-优快云博客

Qt 窗口 无边框化,移动,大小调整_恋恋西风的博客-优快云博客

Qt 停靠悬浮窗口 使用实例_恋恋西风的博客-优快云博客

Qt 在程序中动态添加 删除 View 布局 或控件_恋恋西风的博客-优快云博客

### Qt 中实现控件布局自适应窗口大小 #### 使用布局管理器 为了使控件能够随着窗口大小的变化而自动调整,在设计界面时应优先考虑使用Qt的内置布局管理器。这些布局管理器会处理子部件之间的相对定位以及它们相对于容器边界的间距,从而确保当主窗口被拉伸或压缩时,内部组件也会相应地扩展或收缩[^3]。 #### 设置控件的 Size Policy 属性 除了依赖于布局外,还可以通过配置各个小部件自身的`sizePolicy`属性来进一步微调其行为。此策略决定了该对象在其父级提供的可用区域内应该如何增长或缩减。例如: - `Fixed`: 不允许任何方向上的变动; - `Minimum`, `Maximum`: 设定了最小最大界限; - `Preferred`: 推荐尺寸下可灵活变化; - `Expanding`: 尽可能占据更多剩余空间[^5]。 #### 调整事件响应机制 对于某些特殊需求场景下的动态调整,则可以在派生类里覆写虚函数`resizeEvent()`方法来自定义逻辑。每当发生窗口尺寸更改的时候就会触发这一过程,并在此期间获取当前的新旧矩形区域信息以便做出适当反应[^2]。 ```cpp void MyWindow::resizeEvent(QResizeEvent *event){ QMainWindow::resizeEvent(event); // 获取新的窗口尺寸并据此更新各元素的位置大小... } ``` #### 示例代码展示 这里给出一段简单的C++代码片段用于演示如何创建一个具有基本功能的应用程序框架,其中包含了几个按钮实例化及其关联操作以体现上述原则的实际应用效果。 ```cpp #include <QApplication> #include <QPushButton> #include <QWidget> #include <QVBoxLayout> int main(int argc, char *argv[]){ QApplication app(argc, argv); QWidget window; QVBoxLayout *layout = new QVBoxLayout(&window); QPushButton *button1 = new QPushButton("Button 1"); button1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); layout->addWidget(button1); QPushButton *button2 = new QPushButton("Button 2"); button2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); layout->addWidget(button2); window.setLayout(layout); window.show(); return app.exec(); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值