Qt事件过滤及其应用

        事件过滤器可以对需要的组件接收到的事件进行过滤、以及监控,任意的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得加上,不然输入的数字无法删除。在输入字母时也可以加个弹窗提示。

上一篇:Qt动画(二):移动效果


下一篇:Qt界面无法切换输入法的解决方法