之前做软件课设的时候,发现了一个问题,界面无法放大,也就是无法适应窗口的大小变化,对于用户来说很不友好。后来我在网上找了很多资料,但是发现大部分都是使用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);
}
这样写完就能实现组件自适应窗口大小了
放大前:
放大后: