1. 问题

有的时候需要判断当前用户选择了哪些ui控件,但是对应控件没有被点击的信号,这里就需要通过事件监听过滤器,来处理选中事件

2. Qt GUI 中的事件监听器

在Qt中,当一个事件发生时(例如鼠标点击或某个键盘上的按键按下),其传递顺序如图所示。从这个图可以看出,事件过滤器首先获得事件,其次才是部件的 event 函数,最后是部件的事件处理函数

QT 监听控件选中事件 - 图1

每一个Qt对象,都有一个事件监听器的虚函数
image.png

  1. bool eventFilter(QObject *watched, QEvent *event);
  • 第一个参数为捕捉到事件相关的对象
  • 第二个参数为发生的事件

使用方法

添加定义

MainWindows.h 里面添加 定义,注意要写在public下
image.png

  1. class MainWindow : public QMainWindow {
  2. Q_OBJECT
  3. public:
  4. MainWindow(QWidget *parent = nullptr);
  5. ~MainWindow();
  6. bool eventFilter(QObject *, QEvent *);
  7. private:
  8. Ui::MainWindow *ui;
  9. };

注册需要的控件

在类初始化时,注册需要的控件

  1. MainWindow::MainWindow(QWidget *parent)
  2. : QMainWindow(parent)
  3. , ui(new Ui::MainWindow) {
  4. ui->setupUi(this);
  5. ui->lineEdit->installEventFilter(this); // 注册对lineedit的事件监听
  6. }

重写事件过滤器函数

主要有以下步骤:

  • 判断事件来源
  • 判断事件类型
  • 执行需要的工作
  • 返回 ```cpp // 重写事件过滤器函数 bool MainWindow::eventFilter(QObject watched, QEvent event) { if(watched == ui->lineEdit) { // 第一步判断事件来源

    1. if(event->type() == QEvent::MouseButtonPress) { // 判断事件类型
    2. qDebug() << "in line";
    3. return true; // 代表事件过滤器处理完,其他过滤器不能使用这个事件
    4. //return false; // 代表事件过滤器处理完,事件分发器继续处理这个事件
    5. }

    } else {

      return MainWindow::eventFilter(watched, event); // 将事件交给父类的事件分发器处理
    

    } }

``` 以上代码为,当识别到事件来源是lineEdit, 并且是鼠标点击时候,在控制台进行输出