最近在做项目,学到了不少QT的内容,遇到问题的时候四找资料,但大部分博客都讲的比较全面,所以可能一上来不是那么容易看懂。所以我更新的这些内容都是非常新手向的,先对事件过滤器有个大概的印象:
可以把事件过滤器认为是一张网,这张网可以由你选择安装什么地方(按钮,编辑框,标签,窗体。。。随心所欲),当你把这张网放好之后,你的鼠标,键盘等对相应的控件进行操作的时候,都会先经过这张网,所以你就可以在这张网上面进行一些判断,来决定你要做什么
下边的例子是:窗体上边放了一个标签(label),当鼠标从标签上边移动的时候,显示坐标(相对坐标),当鼠标单击标签的时候,弹出一个对话框
代码:
头文件:
//Widget.h头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QEvent>
#include <QMessageBox>
#include <QDebug>
#include <QMouseEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
bool eventFilter(QObject *, QEvent *); //事件过滤器
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.cpp文件
//widegt.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->label->installEventFilter(this); /*为标签安装过滤器*/
}
Widget::~Widget()
{
delete ui;
}
bool Widget::eventFilter(QObject *obj, QEvent *ev)
{
if(obj == ui->label && ev->type() == QEvent::MouseMove) /*鼠标进入标签*/
{
QMouseEvent *m = (QMouseEvent*)ev; /*这2行是为了显示出鼠标位置*/
qDebug() << "x,y:" << m->x() << "," << m->y();
}
else if(obj == ui->label && ev->type() ==QEvent::MouseButtonPress) /*鼠标点击标签*/
{
QMessageBox::information(this, "提示", "标签被点击");
}
return QWidget::eventFilter(obj, ev);
}
简单画了个界面, 中间是一个label
鼠标从标签上边移动的效果,截图没截好,图中鼠标不在标签上。。。
点击标签的效果:
这是事件过滤器最简单的一个小例子,事实上,可以通过事件过滤器非常方便的实现一些功能,如嵌入式环境下调用软键盘,以及防止界面掩盖等。建议和我一样的新手小伙伴看了这篇博客后,去看下其他人的事件过滤器相关博客,应该会收益良多,谢谢