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