说好的计划,就要实现,今年我要把吹过的牛皮,设定的计划,统统给圆了。
今天我们来看过滤器函数,为QObject的一个虚函数。今天使用的我们主要是3个函数:
virtual bool eventFilter(QObject *watched, QEvent *event) //过滤器函数
void installEventFilter(QObject *filterObj) //安装过滤器函数
void removeEventFilter(QObject *obj) //清除过滤器函数
当我们经常想要对控件交互时候,去操作自己的处理方式。比如鼠标事件(mousePressEvent),键盘事件(keyPressEvent)。
下面我们简单看看如何处理。
从上面可以看出来,类型对象都是继承QObject的对象,这样就会调用虚继承的函数,这也是为啥希望大家把c++ 类继承一定要搞清楚的原因了。
如图,我左边放了一个graphicsView 右边放了一个textEdit。
对应代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->graphicsView->installEventFilter(this); //我们添加
ui->textEdit->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
QMouseEvent *mouse = static_cast<QMouseEvent*>(event);
if(watched == ui->graphicsView)
{
if(mouse->button() == Qt::LeftButton)
{
qDebug() << "输出graphicsView MouseButtonPress";
return true;
}
}
if(watched == ui->textEdit)
{
if(mouse->button() == Qt::LeftButton)
{
qDebug() << "输出 textEdit MouseButtonPress";
return true;
}
}
return QWidget::eventFilter(watched,event);
}
输出结果:
输出graphicsView MouseButtonPress
输出graphicsView MouseButtonPress
输出 textEdit MouseButtonPress
输出 textEdit MouseButtonPress
输出 textEdit MouseButtonPress
输出 textEdit MouseButtonPress
输出 textEdit MouseButtonPress
输出 textEdit MouseButtonPress
这个过滤器使用的时候还是有点小问题的,就是点击graphcsView,有时候不触发。伤心。