如何接收Widget大小调整信号?自定义窗口resizeEvent不生效求助
问题根因
你重写的是Keypad类的resizeEvent事件,但实际调用show()展示的是Keypad内部独立的Widget_Keypad窗口,Keypad本身从未被渲染显示,也不会触发大小变化事件,因此对应的resizeEvent不会执行。
解决方案
方案1:将Keypad本身作为窗口使用(推荐)
直接把UI元素挂载到Keypad自身,无需额外创建独立的Widget_Keypad:
- 修改
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 ); }
- 修改
main.cpp的调用逻辑,直接显示Keypad对象:
Keypad *keypad = new Keypad(); keypad->show();
方案2:保留Widget_Keypad作为展示窗口
如果需要保留现有结构,可以通过事件过滤器监听Widget_Keypad的大小变化:
- 在
Keypad类的头文件中声明事件过滤器函数:
protected: bool eventFilter(QObject *watched, QEvent *event) override;
- 在
CreateUi函数中为Widget_Keypad安装事件过滤器:
Widget_Keypad = new QWidget; Widget_Keypad->installEventFilter(this); // 后续原有逻辑保持不变
- 实现事件过滤器函数,捕获大小变化事件:
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
相关产品推荐
相关产品推荐

