事件过滤器允许你捕获并处理特定类型的事件,以便在不修改类继承结构的情况下拦截和处理事件。
下面是一个示例,演示了如何使用事件过滤器来实现文本框只能输入数字:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTextEdit>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
bool eventFilter(QObject *obj, QEvent *event);
private:
QTextEdit* textEdit = nullptr;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QEvent>
#include <QKeyEvent>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
textEdit = new QTextEdit;
this->setCentralWidget(textEdit);
textEdit->setAttribute(Qt::WA_InputMethodEnabled, false);
// 监视组件对象
textEdit->installEventFilter(this);
}
MainWindow::~MainWindow()
{
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
qDebug() << keyEvent->key();
if ((keyEvent->key() >= Qt::Key_0 && keyEvent->key() <= Qt::Key_9))
{
// 无需转发
return false;
}
else
{
// 屏蔽其他按键事件
return true;
}
}
}
// 其他事件交给父类处理
return QMainWindow::eventFilter(obj, event);
}