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]