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