事件过滤器可以很容易的处理多个部件的多个事件。
事件过滤器是由两个函数组成的一种操作。两个函数为InstallEventFilter()eventFilter()。
实现步骤:
1.创建部件
2.为部件安装过滤器InstallEventFilter
3.在mainwindows中添加eventFilter处理函数
3.1判断部件类型
3.2判断事件类型
代码示例
MainWindow.h MainWindow.cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool eventFilter(QObject *obj, QEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>
#include <QWheelEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->textEdit->installEventFilter(this); // 为编辑器部件在本窗口上安装事件过滤器
ui->spinBox->installEventFilter(this);
QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
qApp->sendEvent(ui->spinBox, &myEvent); // 发送键盘事件到spinBox
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event) // 事件过滤器
{
if (obj == ui->textEdit) { // 判断部件
if (event->type() == QEvent::Wheel) { // 判断事件
// 将event强制转换为发生的事件的类型
QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
if (wheelEvent->delta() > 0) ui->textEdit->zoomIn();
else ui->textEdit->zoomOut();
return true; // 该事件已经被处理
} else {
return false; // 如果是其他事件,可以进行进一步的处理
}
}
else if (obj == ui->spinBox) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Space) {
ui->spinBox->setValue(0);
return true;
} else {
return false;
}
} else {
return false;
}
}
else return QWidget::eventFilter(obj, event);
}