Qt笔记:信号与槽+事件系统
信号与槽1 信号与槽定义信号控件状态变化时主动发射的通知按钮点击、文本修改无返回值仅负责广播消息。 槽函数普通成员函数用来接收信号、执行业务逻辑可被直接调用。connect完成信号发射端、槽接收端绑定实现通信。核心优势完全解耦发送方不用关心谁接收、接收方不用关心信号来源降低类耦合UI 逻辑分离便于维护、复用控件。2 五种信号槽连接方式函数指针类成员函数connect(btn,QPushButton::clicked,this,Widget::onClick)类型编译期校验最稳妥。Lambda 表达式适合临时简短逻辑无需单独写槽函数。槽函数字符串形式旧版 SIGNAL/SLOT 宏Qt6 不推荐运行时校验写错无编译报错容易出错。静态重载函数 connect适配重载信号手动指定参数类型。Qt5 风格自动连接on_控件名_信号名命名规范自动绑定无需手写 connect。3 Lambda 实战登录校验按钮点击信号绑定 Lambda直接获取账号、密码输入框文本做非空、账号密码比对判断弹窗提示登录成功 / 失败不用额外定义槽函数精简界面交互代码。4 自定义信号在类头文件signals:区块声明自定义信号无需实现函数体业务处用emit 自定义信号(参数)触发。通过 connect 绑定自定义信号到槽函数实现组件间自定义消息传递多用于子控件向父窗体传参。5 disconnect senderdisconnect()解绑信号槽分为断开指定连接、断开对象所有信号、断开对象所有槽三种用法用于临时禁用按钮事件、动态切换逻辑。QObject *sender()槽函数内调用获取触发当前槽的信号发送对象强转对应控件类型实现多个控件复用同一个槽函数。Qt 事件系统1 事件 VS 信号槽事件底层原生消息鼠标、键盘、绘制、窗口缩放由 QEvent 封装Qt 事件循环依次派发是底层基础。核心区别事件底层原生消息可拦截、过滤、重写信号槽是上层封装信号槽由事件触发生成按钮点击事件→发射 clicked 信号事件偏向底层交互拦截信号槽偏向上层业务逻辑解耦2 常见事件重写继承控件重写对应事件虚函数实现自定义行为mousePressEvent鼠标按下、mouseMoveEvent鼠标移动、mouseReleaseEvent鼠标抬起keyPressEvent键盘按键paintEvent界面绘制closeEvent窗口关闭拦截 可调用event-accept()消费事件、ignore()继续向上传递事件3 事件过滤器原理给目标控件安装installEventFilter(this)重写eventFilter函数在事件抵达控件前提前拦截处理。优势不用继承控件重写事件一个过滤器可以管控多个控件事件统一拦截鼠标、键盘事件适合全局按键屏蔽、统一样式 hover 处理。核心总结信号槽上层业务解耦通信日常界面交互首选自定义信号实现组件通信Lambda 简化短逻辑sender 复用槽、disconnect 动态解绑。事件系统底层消息驱动重写事件做控件定制事件过滤器实现全局事件拦截信号槽本质是 Qt 对原生事件的上层封装。