1. 问题
有的时候需要判断当前用户选择了哪些ui控件,但是对应控件没有被点击的信号,这里就需要通过事件监听过滤器,来处理选中事件
2. Qt GUI 中的事件监听器
在Qt中,当一个事件发生时(例如鼠标点击或某个键盘上的按键按下),其传递顺序如图所示。从这个图可以看出,事件过滤器首先获得事件,其次才是部件的 event 函数,最后是部件的事件处理函数
每一个Qt对象,都有一个事件监听器的虚函数
bool eventFilter(QObject *watched, QEvent *event);
- 第一个参数为捕捉到事件相关的对象
- 第二个参数为发生的事件
使用方法
添加定义
在 MainWindows.h
里面添加 定义,注意要写在public下
class MainWindow : public QMainWindow {
Q_OBJECT
public:
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, 并且是鼠标点击时候,在控制台进行输出