绝代码农 发表于 2021-7-9 09:23:45

Qt事件过滤及其应用

  事件过滤器可以对需要的组件接收到的事件进行过滤、以及监控,任意的QObject对象都可以作为事件过滤器使用。需要注意以下两点:
  (1)事件过滤器的实现,需要重写eventFilter()函数。
  (2)组件要想被监控,则需要通过installEventFilter()安装事件过滤器
  例如,禁止编辑框输入字母,只能输入数字,这时候需要用到事件过滤。在头文件中添加一个函数 :
//重写该事件
bool eventFilter(QObject *obj, QEvent *event) override;  cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QKeyEvent>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->lineEdit->setAttribute(Qt::WA_InputMethodEnabled, false); //禁止中文输入法
    ui->lineEdit->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(obj == ui->lineEdit)
    {
      if(event->type() == QEvent::KeyPress)
      {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

            //显示按键对应的值
            qDebug() << "Ate key press" << keyEvent->key();

            //只接受0~9数字
            switch(keyEvent->key())
            {
            case Qt::Key_0:
            case Qt::Key_1:
            case Qt::Key_2:
            case Qt::Key_3:
            case Qt::Key_4:
            case Qt::Key_5:
            case Qt::Key_6:
            case Qt::Key_7:
            case Qt::Key_8:
            case Qt::Key_9:
            case Qt::Key_Backspace:   //删除键
                return false;
            default:
                QMessageBox::information(this, "tips", "please ipnut number", NULL);
                return true;
            }
      }
      else
      {
            return false;
      }
    }
    else
    {
      return QMainWindow::eventFilter(obj, event);
    }
}  注意,删除键Key_Backspace得加上,不然输入的数字无法删除。在输入字母时也可以加个弹窗提示。

  
文档来源:51CTO技术博客https://blog.51cto.com/u_12570763/3012392
页: [1]
查看完整版本: Qt事件过滤及其应用