评论

收藏

[jQuery] Qt事件过滤及其应用

开发技术 开发技术 发布于:2021-07-09 09:23 | 阅读数:278 | 评论:0

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

  
关注下面的标签,发现更多相似文章