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

如何接收Widget大小调整信号?自定义窗口resizeEvent不生效求助

问题根因

你重写的是Keypad类的resizeEvent事件,但实际调用show()展示的是Keypad内部独立的Widget_Keypad窗口,Keypad本身从未被渲染显示,也不会触发大小变化事件,因此对应的resizeEvent不会执行。

解决方案

方案1:将Keypad本身作为窗口使用(推荐)

直接把UI元素挂载到Keypad自身,无需额外创建独立的Widget_Keypad:

  1. 修改Keypad.cpp的CreateUi函数:
void Keypad::CreateUi()
{
    // 布局直接挂载到当前Keypad对象,不需要额外的QWidget
    Vertical_Layout = new QVBoxLayout(this);

    Hlayout_ShowRange = new QHBoxLayout;
    
    lbl_ShowRange = new QLabel;  
    lbl_ShowRange->setText( "0 ~ 999" );
    Hlayout_ShowRange->addWidget( lbl_ShowRange );
    
    Vertical_Layout->addLayout( Hlayout_ShowRange );
}
  1. 修改main.cpp的调用逻辑,直接显示Keypad对象:
Keypad *keypad = new Keypad();
keypad->show();

方案2:保留Widget_Keypad作为展示窗口

如果需要保留现有结构,可以通过事件过滤器监听Widget_Keypad的大小变化:

  1. 在Keypad类的头文件中声明事件过滤器函数:
protected:
    bool eventFilter(QObject *watched, QEvent *event) override;
  1. 在CreateUi函数中为Widget_Keypad安装事件过滤器:
Widget_Keypad = new QWidget;
Widget_Keypad->installEventFilter(this);
// 后续原有逻辑保持不变
  1. 实现事件过滤器函数,捕获大小变化事件:
bool Keypad::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == Widget_Keypad && event->type() == QEvent::Resize) {
        QResizeEvent *resizeEvent = static_cast<QResizeEvent*>(event);
        qDebug() << resizeEvent->size().width();
        return true;
    }
    return QWidget::eventFilter(watched, event);
}

注意事项

  • 确认Keypad类正确继承QWidget,且头文件中包含Q_OBJECT宏
  • 重写事件函数时添加override关键字,避免签名错误导致重写失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:04