qt用代码实现组件自适应窗口大小

之前做软件课设的时候,发现了一个问题,界面无法放大,也就是无法适应窗口的大小变化,对于用户来说很不友好。后来我在网上找了很多资料,但是发现大部分都是使用qt自带的布局或者加入弹簧来实现的组件自适应窗口大小,但这样做有一个缺点,就是界面设计中用布局的话会导致整个页面都被组件覆盖,使用弹簧的话会发现组件并不会变大只是位置不变。因此我们这里选择通过重写resizeEvent函数的方式来获取窗口大小变化的比例,从而确定组件随窗口大小变化后的位置和大小。

代码如下:

比如我下面这个是login.h文件

#pragma execution_character_set("utf-8")
#ifndef LOGIN_H
#define LOGIN_H
#include <QWidget>
#include "ui_login.h"
#include <QResizeEvent>
#include <QRect>
namespace Ui {
class login;
}
class login : public QWidget
{
    Q_OBJECT
public:
    explicit login(QWidget *parent = 0);
    static QString number;
    static int id;

    ~login();
    void resizeEvent(QResizeEvent* event);
private slots:
    void on_loginButton_clicked();
    void on_EditButton_clicked();
    void on_exitButton_clicked();

private:
    Ui::login *ui;
    QList<QWidget*> m_Widget;			    //存储所有的子控件
    QMap<QWidget*, QRect> m_WidgetRect;		//保存每个子控件的初始大小
};
#endif // LOGIN_H

下面是需要加在login.c文件里的东西

构造函数里面这样写

login::login(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::login)
{
    ui->setupUi(this);
    this->setWindowTitle(QStringLiteral("登录"));
    //获取所有的控件
        m_Widget = this->findChildren<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
        //遍历控件获取大小和位置
        foreach(auto widget, m_Widget)
        {
            m_WidgetRect.insert(widget, QRect(widget->x(), widget->y(), widget->width(), widget->height()));
        }
}

然后重写resizeEvent函数

void login::resizeEvent(QResizeEvent* event) //控件大小和代码
{
    float width = this->width() * 1./ 524;
    float height = this->height() * 1./340;
    for ( auto it= m_WidgetRect.begin(); it != m_WidgetRect.end(); it++ )
    {
        it.key()->setGeometry(it.value().x() * width, it.value().y() * height, it.value().width() * width, it.value().height() * height);
    }

    QWidget::resizeEvent(event);
}

这样写完就能实现组件自适应窗口大小了

放大前:

放大后:

 

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄昏信徒

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值