You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QWidget A中捕获QWidget B的resizeEvent与moveEvent事件?

解决方案:无需修改Widget B即可监听其 resize/move 事件

当然可以!你完全不用在Widget B的resizeEvent()或moveEvent()里添加任何信号逻辑,只在Widget A里做文章就能实现需求。下面给你两种最常用的Qt方案:

方法1:利用事件过滤器(Event Filter)

这是Qt中监听其他对象事件的经典方式,完全不需要改动Widget B的代码:

  1. 首先在Widget A的初始化代码(比如构造函数)里,给Widget B安装事件过滤器:
// 假设widgetB是你要监听的目标Widget指针
widgetB->installEventFilter(this);
  1. 然后重写Widget A的eventFilter()方法,拦截并处理目标事件:
bool WidgetA::eventFilter(QObject* watched, QEvent* event) {
    // 确认事件来自Widget B
    if (watched == widgetB) {
        if (event->type() == QEvent::Resize) {
            // Widget B发生了尺寸变化,执行你的更新逻辑
            updateMyWidget();
        } else if (event->type() == QEvent::Move) {
            // Widget B发生了位置移动,执行你的更新逻辑
            updateMyWidget();
        }
    }
    // 务必把事件交还给父类处理,避免破坏Widget B的正常事件流程
    return QWidget::eventFilter(watched, event);
}

这种方法的核心优势是完全解耦,Widget B根本不知道自己被监听了,后续你给Widget B的resizeEvent()加任何新逻辑都不会影响这个监听机制。

方法2:监听Widget的geometryChanged信号

QWidget的geometry属性自带一个geometryChanged(QRect)通知信号——不管是resize(改变宽高)还是move(改变位置),只要Widget的几何属性发生变化,这个信号就会触发。你可以直接在Widget A里连接这个信号:

// 在Widget A的初始化代码里
connect(widgetB, &QWidget::geometryChanged, this, [this](const QRect& newGeometry) {
    // 这里写你的更新逻辑,newGeometry可以直接拿到Widget B的新位置和大小
    updateMyWidget();
});

这种方法比事件过滤器更简洁,代码量更少,适合只需要响应变化、不需要拦截事件的场景。同样,完全不需要修改Widget B的代码,后续对Widget B的任何改动都不会影响这个信号连接。

总结一下:两种方法都能让你在不修改Widget B的前提下,在Widget A中感知到它的resize和move事件,完美解决你的顾虑~

内容的提问来源于stack exchange,提问作者Drew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:52:14