QT学习记录3(事件过滤器)

 最近在做项目,学到了不少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 

 鼠标从标签上边移动的效果,截图没截好,图中鼠标不在标签上。。。

 点击标签的效果:

 这是事件过滤器最简单的一个小例子,事实上,可以通过事件过滤器非常方便的实现一些功能,如嵌入式环境下调用软键盘,以及防止界面掩盖等。建议和我一样的新手小伙伴看了这篇博客后,去看下其他人的事件过滤器相关博客,应该会收益良多,谢谢

猜你喜欢

转载自blog.csdn.net/zh15237774494/article/details/84330224