【QT随笔】巧用事件过滤器(installEventFilter 和 eventFilter 的组合)之 QComboBox 应用
在Qt框架中,事件过滤器(Event Filter)是一种强大的事件处理机制,它允许一个对象监视并拦截发送到另一个对象的事件。这种机制基于观察者模式,为我们提供了处理特定事件的灵活方式。
(关注不迷路哈!!!)
前言
Q1:为什么要使用事件过滤器?
传统的事件处理方式(如重写event()
或特定事件处理函数)存在一些局限性:
- 侵入性强:需要子类化才能重写事件处理
- 不够灵活:难以动态添加/移除事件处理逻辑
- 代码分散:事件处理逻辑分散在各个子类中
事件过滤器通过
installEventFilter()
和eventFilter()
的组合,完美解决了这些问题。
Q2:事件过滤器核心原理是什么?
一、QComboBox 事件过滤器之应用架构与处理流程
1. 事件过滤器之应用架构(类图)
2. 事件过滤器之处理流程(流程图)
二、事件过滤器的生命周期(详细)
- 具体介绍,我已经放到另外一篇文章(【QT随笔】事件过滤器(installEventFilter 和 eventFilter 的组合)之生命周期管理详解)进行详细解释,感兴趣的友友可以自行阅读。
三、QComboBox 事件过滤器之实战应用
场景1:禁止鼠标滚轮改变选中项
// 自定义事件过滤器类
class WheelEventFilter : public QObject
{
Q_OBJECT
public:
explicit WheelEventFilter(QObject *parent = nullptr) : QObject(parent) {
}
protected:
bool eventFilter(QObject *watched, QEvent *event) override
{
if (event->type() == QEvent::Wheel) {
// 拦截所有QComboBox的滚轮事件
if (qobject_cast<QComboBox*>(watched)) {
return true; // 拦截事件
}
}
return QObject::eventFilter(watched, event);
}
};
// 使用方式
QComboBox *comboBox = new QComboBox(this);
comboBox->installEventFilter(new WheelEventFilter(this));
场景2:智能弹出下拉框
class SmartComboBoxFilter :