Qt实现窗口内的控件自适应窗口大小

**前言:**因为有时候窗口内的控件比较大,但是为了同时操作多个窗口,希望可以根据情况,在调整窗口大小时,控件能自适应大小,于是通过遍历整个界面内的控件,并在调整大小的事件中按比率调整控件大小实现了此功能。有点小问题是文字的大小比较不好控制,还有待优化。

一、变量和函数定义

在窗口类头文件中定义

cpp 复制代码
// 控件根据窗口大小自动调整控件大小 @{
protected:
    /** 窗口尺寸改变时自动调用 **/
    void resizeEvent(QResizeEvent* event) override;
private:
    // 窗口内所有的控件
    QMap<QWidget*, QRect> allWidgetMap;
    // 窗口内所有的布局
    QMap<QLayout*, QRect> allLayoutMap;
    // 窗口原始尺寸
    QSize windowOriginalSize;
    /** 查找窗口内所有的布局和控件 **/
    void findAllLayoutAndWidget(QObject *object);
// 控件根据窗口大小自动调整控件大小 @}

二、查找所有窗口内控件,并在"窗口调整大小" 事件中,实时根据窗口比率调整控件大小

1)函数实现

cpp 复制代码
// 控件根据窗口大小自动调整控件大小 @{
void MyWindow::resizeEvent(QResizeEvent* event)
{
    double scaleX = event->size().width() * 1.0 / windowOriginalSize.width();
    double scaleY = event->size().height() * 1.0 / windowOriginalSize.height();
    for (auto iter = allLayoutMap.begin(); iter != allLayoutMap.end(); ++iter) {
        QLayout* layout = iter.key();
        QRect originalGeometry = iter.value();
        QRect newGeometry(
            originalGeometry.x() * scaleX,
            originalGeometry.y() * scaleY,
            originalGeometry.width() * scaleX,
            originalGeometry.height() * scaleY
            );
        layout->setGeometry(newGeometry);
    }

    for (auto iter = allWidgetMap.begin(); iter != allWidgetMap.end(); ++iter) {
        QWidget* widget = iter.key();
        QRect originalGeometry = iter.value();
        QRect newGeometry(
            originalGeometry.x() * scaleX,
            originalGeometry.y() * scaleY,
            originalGeometry.width() * scaleX,
            originalGeometry.height() * scaleY
            );
        widget->setGeometry(newGeometry);

        QPushButton* btn = dynamic_cast<QPushButton*>(widget);
        // 调整按钮字体大小
        if (btn != NULL) {
            QFont font = btn->font();
            // 根据按钮的宽度/高度调整字体大小,可以根据默认控件的高度和字体的大小比率进行适当调整
            font.setPointSize(btn->height() / 3);
            btn->setFont(font);
        }
        // QLabel* label = dynamic_cast<QLabel*>(widget);
        // 调整标签字体大小
        // if (label != NULL) {
        //     QFont font = label->font();
        //     // 根据按钮的宽度/高度调整字体大小,可以根据默认控件的高度和字体的大小比率进行适当调整
        //     font.setPointSize(label->height() / 2);
        //     label->setFont(font);
        // }
    }
}

void MyWindow::findAllLayoutAndWidget(QObject *object) {
    QLayout *layout = qobject_cast<QLayout*>(object);
    QWidget *widget = qobject_cast<QWidget*>(object);
    if (layout) {
        if (layout->objectName() != "" && !allLayoutMap.contains(layout)) {
            allLayoutMap.insert(layout, layout->geometry());
        }
        for (int i = 0; i < layout->count(); ++i) {
            findAllLayoutAndWidget(layout->itemAt(i)->widget());
        }
    } else if (widget) {
        if (widget != this && widget->objectName() != "" && !allWidgetMap.contains(widget)) {
            allWidgetMap.insert(widget, widget->geometry());
        }
        for (int i = 0; i < widget->children().size(); ++i) {
            findAllLayoutAndWidget(widget->children().at(i));
        }
    }
}
// 控件根据窗口大小自动调整控件大小 @}

2)在构造函数中调用查找控件函数

cpp 复制代码
MyWindow::MyWindow(QWidget *parent) : QWidget(parent), ui(new Ui::MyWindow)
{
    ui->setupUi(this);
    // 控件根据窗口大小自动调整控件大小 @{
    // 延时为了获取的控件初始大小是正确的
    QTimer* t = new QTimer(this);
    connect(t, &QTimer::timeout, this, [=]() {
        t->stop();
        t->deleteLater();
        findAllLayoutAndWidget(this);
        windowOriginalSize = this->size();
    });
    t->start(500);
    // 控件根据窗口大小自动调整控件大小 @}
}
相关推荐
前端开发与ui设计的老司机26 分钟前
数字孪生技术引领UI前端设计潮流:增强现实(AR)的集成应用
ui
DolphinDB1 小时前
如何在C++交易系统中集成高性能回测与模拟撮合
c++
feiyangqingyun1 小时前
Qt音视频开发技巧/推流带旋转角度/rtsprtmp推流/保存文件到MP4/拉流解析旋转角度
qt·音视频·qt旋转角度推流
筏.k2 小时前
C++ 网络编程(14) asio多线程模型IOThreadPool
网络·c++·架构
共享ui设计和前端开发人才2 小时前
UI前端与数字孪生结合探索:智慧建筑的能耗管理与优化
前端·ui·状态模式
清醒的兰3 小时前
Qt 基于TCP套接字编程
网络·qt·tcp
爱喝茶的小茶3 小时前
周赛98补题
开发语言·c++·算法
OpenC++3 小时前
【C++】备忘录模式
c++·设计模式·备忘录模式
小庞在加油4 小时前
《dlib库中的聚类》算法详解:从原理到实践
c++·算法·机器学习·数据挖掘·聚类
ComputerInBook4 小时前
C++ 标准模板库算法之 transform 用法
开发语言·c++·算法·transform算法