1. 问题
有的时候需要判断当前用户选择了哪些ui控件,但是对应控件没有被点击的信号,这里就需要通过事件监听过滤器,来处理选中事件
2. Qt GUI 中的事件监听器
在Qt中,当一个事件发生时(例如鼠标点击或某个键盘上的按键按下),其传递顺序如图所示。从这个图可以看出,事件过滤器首先获得事件,其次才是部件的 event 函数,最后是部件的事件处理函数

每一个Qt对象,都有一个事件监听器的虚函数
bool eventFilter(QObject *watched, QEvent *event);
- 第一个参数为捕捉到事件相关的对象
- 第二个参数为发生的事件
使用方法
添加定义
在 MainWindows.h 里面添加 定义,注意要写在public下
class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();bool eventFilter(QObject *, QEvent *);private:Ui::MainWindow *ui;};
注册需要的控件
在类初始化时,注册需要的控件
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);ui->lineEdit->installEventFilter(this); // 注册对lineedit的事件监听}
重写事件过滤器函数
主要有以下步骤:
- 判断事件来源
- 判断事件类型
- 执行需要的工作
返回 ```cpp // 重写事件过滤器函数 bool MainWindow::eventFilter(QObject watched, QEvent event) { if(watched == ui->lineEdit) { // 第一步判断事件来源
if(event->type() == QEvent::MouseButtonPress) { // 判断事件类型qDebug() << "in line";return true; // 代表事件过滤器处理完,其他过滤器不能使用这个事件//return false; // 代表事件过滤器处理完,事件分发器继续处理这个事件}
} else {
return MainWindow::eventFilter(watched, event); // 将事件交给父类的事件分发器处理} }
``` 以上代码为,当识别到事件来源是lineEdit, 并且是鼠标点击时候,在控制台进行输出
