QT六 自适应布局 resize()和resizeevent事件关系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/sinat_30491515/article/details/140832345

当我们改变画面的大小的时候,会触发 resize 函数,进而会调用到 resizeEvent函数

两个关注点

各个控件初始都有被设置成默认尺寸,经debugg测试发现,软件启动时,主窗体和子控件都会被触发一次resizeEvent事件。
使用QPainter绘图,resizeEvent 事件中调用update()函数,会自动触发 paintEvent(QPaintEvent *event)方法。

1、resize函数


在Qt中,resize() 函数用于设置窗口或控件的大小。它是 QWidget 类的一个成员函数,用来动态地改变窗口或控件的大小。
调用该函数后,窗口或控件会立即更新其大小,会自动触发 resizeEvent 事件。

2、resizeEvent 事件


resizeEvent 是一个虚拟函数,当窗口或控件的大小发生变化时被调用。在 Qt 的事件处理机制中,每当窗口大小发生变化时,都会生成一个 QResizeEvent 对象,并通过 resizeEvent 函数传递给相应的窗口或控件。

2.1、resizeEvent触发的场景


控件显示时的初始大小设置:
当一个控件第一次显示时,其大小会被设置为初始值。这时会触发 resizeEvent。
控件的大小改变:
如果控件的大小在运行时发生改变(例如调用了 resize() 函数),就会触发 resizeEvent。
窗口的大小改变:
当窗口控件(如 QMainWindow、QDialog)的大小改变时,窗口中的所有子控件的 resizeEvent 会被触发。
布局管理器调整控件大小:
如果控件使用了布局管理器(如 QVBoxLayout、QHBoxLayout 等),当父控件的大小改变时,布局管理器会自动调整其管理的子控件的大小,从而触发子控件的 resizeEvent。
窗口的最大化和最小化:
当窗口被最大化或最小化时,窗口及其内部的所有控件的大小都会发生变化,从而触发 resizeEvent。
窗口内容的改变:
如果控件内部的内容变化导致控件需要重新调整大小,也会触发 resizeEvent。例如,当控件内的文本内容增多导致控件需要扩展以显示全部内容时。
操作系统或窗口管理器的事件:
某些情况下,操作系统或窗口管理器可能会发送窗口大小变化的事件,这也会导致 Qt 应用程序中的控件的 resizeEvent 被触发。


3、父子控件关系


子控件(子widget)的大小调整通常是由父控件(父widget)的 resize() 函数或其他导致父控件大小改变的操作来触发的。子控件的 resizeEvent 不需要直接由子控件自身的 resize() 函数来触发,而是依赖于父控件的大小变化,进而影响到子控件的布局和大小。

3.1、如何工作


父控件的 resize() 函数调用:
当父控件的 resize() 函数被调用时,父控件的大小会立即改变。
Qt 的布局管理器(例如 QVBoxLayout、QHBoxLayout 等)通常会捕获父控件大小的变化,并据此调整其管理的子控件的大小和位置。
子控件的布局管理:
如果子控件使用了布局管理器,布局管理器会响应父控件大小的变化,重新计算并调整子控件的大小和位置。
如果子控件没有使用布局管理器,而是直接在 resizeEvent 中手动调整大小和位置,那么在父控件的 resizeEvent 中重新计算和调整子控件的大小通常是一个良好的做法。
子控件的 resizeEvent 事件:
当父控件大小变化时,Qt 框架会自动管理子控件的 resizeEvent 事件的触发。
子控件可以重写 resizeEvent 函数以响应其自身大小的变化,通常用于重新绘制内容或调整子控件内部布局。

#include 

class ChildWidget : public QWidget
{
public:
    ChildWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
    void resizeEvent(QResizeEvent *event) override {
        qDebug() << "ChildWidget resized to:" << event->size();
        QWidget::resizeEvent(event); // 调用父类的resizeEvent处理
    }
};

class ParentWidget : public QWidget
{
public:
    ParentWidget(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);
        ChildWidget *childWidget = new ChildWidget(this);
        layout->addWidget(childWidget);
    }

protected:
    void resizeEvent(QResizeEvent *event) override {
        qDebug() << "ParentWidget resized to:" << event->size();
        QWidget::resizeEvent(event); // 调用父类的resizeEvent处理
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    ParentWidget parentWidget;
    parentWidget.resize(400, 300); // 设置初始大小
    parentWidget.setWindowTitle("Parent and Child Resize Example");
    parentWidget.show();

    return app.exec();
}

3.2、特殊情况


如果你的widget是运行时动态创建的,比如widgetA类和widgetB类都继承QWidget类,都设定了布局管理,都是new出来的,A对象当作B对象的容器,当给A进行resize的时候,并没有自动触发B中的resizeEvent事件,而是要对B类对象进行resize才能触发相关事件。
项目比较复杂,debugg过程确实进入不到相应断点,没有单独测试,感兴趣的小伙伴自行测试一下。
 

你可能感兴趣的:(QT,study,qt,开发语言)