IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【QT】16 事件分发器/过滤器 -> 正文阅读

[C++知识库]【QT】16 事件分发器/过滤器

??代码资源:https://download.csdn.net/download/qq_36926037/85052673

16.1 项目准备

?? (1)创建项目,详细过程步骤:https://blog.csdn.net/qq_36926037/article/details/123720720
??(2)创建自定义控件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
??(3)修改自定义控件的基类为QLabel类
在这里插入图片描述
在这里插入图片描述
??(4)鼠标事件声明

#ifndef MYLABEL2_H
#define MYLABEL2_H

#include <QLabel>

class myLabel2 : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel2(QWidget *parent = nullptr);
    //鼠标进入与离开事件的声明,鼠标点击事件的声明
    void enterEvent(QEvent *ev);
    void leaveEvent(QEvent *ev);
    void mousePressEvent(QMouseEvent *ev) ;
signals:

};

#endif // MYLABEL2_H

在这里插入图片描述

??(5)鼠标事件的实现

#include "mylabel2.h"
#include <QDebug>
myLabel2::myLabel2(QWidget *parent) : QLabel(parent)
{

}
void myLabel2:: enterEvent(QEvent *ev)
{
    qDebug()<<"鼠标进入自定义控件";
}
void myLabel2::leaveEvent(QEvent *ev)
{
     qDebug()<<"鼠标离开自定义控件";
}

void myLabel2::mousePressEvent(QMouseEvent *ev) 
{
    //鼠标点击事件
     qDebug()<<"鼠标按下";
}

在这里插入图片描述

??(6)自定义控件的使用,包含事件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

16.2 事件分发器

??*事件分发器:用于事件的分发,可以进行事件拦截的操作。事件分发器返回布尔类型:bool event(QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用步骤:重写event事件
在这里插入图片描述

??(1)事件分发器声明

#ifndef MYLABEL2_H
#define MYLABEL2_H

#include <QLabel>

class myLabel2 : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel2(QWidget *parent = nullptr);
    //鼠标进入与离开事件的声明
    void enterEvent(QEvent *ev);
    void leaveEvent(QEvent *ev);
     void mousePressEvent(QMouseEvent *ev) ;
    
    //(1)通过事件分发器,拦截鼠标事件
    bool event(QEvent *ev);

signals:
};

#endif // MYLABEL2_H

在这里插入图片描述

??(2)事件分发器实现

#include "mylabel2.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
myLabel2::myLabel2(QWidget *parent) : QLabel(parent)
{

}
void myLabel2:: enterEvent(QEvent *ev)
{
    qDebug()<<"鼠标进入自定义控件";
}
void myLabel2::leaveEvent(QEvent *ev)
{
     qDebug()<<"鼠标离开自定义控件";
}

void myLabel2::mousePressEvent(QMouseEvent *ev)
{
    //鼠标点击事件
     qDebug()<<"鼠标按下";
}

//(1)通过事件分发器,拦截鼠标事件
bool myLabel2::event(QEvent *e )
{
    //如果鼠标点击,在event事件分发器中,执行拦截操作
    if(e->type()==QEvent::MouseButtonPress)
    {
        //类型装换
        QMouseEvent *ev=static_cast<QMouseEvent *>(e);
        QString str=QString("拦截了鼠标点击了事件");
        qDebug()<<str;
        return true;//true代表用户自主处理事件,不想下分发事件
    }
    //其他事件,交给父类处理
    return QLabel::event(e);
}

在这里插入图片描述

16.3 事件过滤器

??事件过滤器:可以在程序分发到event事件之前再做一次高级拦截。事件分发器返回布尔类型:bool eventfilter(QObject*obj,QEvent *ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用两个步骤:1.给控件安装事件过滤器;2.重写eventfilter事件。
在这里插入图片描述

16.3.1 安装事件过滤器

??(1)添加label控件
在这里插入图片描述
??(2)安装事件过滤器

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //步骤o1:安装事件过滤器
    ui->label_2->installEventFilter(this);
    //步骤02:重写事件过滤器    
}
Widget::~Widget()
{
    delete ui;
}

在这里插入图片描述

16.3.2 重写事件过滤器

??(1)事件过滤器声明

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    
    //重写事件过滤器
    bool eventFilter(QObject *,QEvent *);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

在这里插入图片描述

??(2)事件过滤器实现

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMouseEvent>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //步骤o1:安装事件过滤器
    ui->label_2->installEventFilter(this);
    //步骤02:重写事件过滤器


}

Widget::~Widget()
{
    delete ui;
}
//事件过滤器实现
bool Widget::eventFilter(QObject *obj,QEvent *ev)
{
    if (obj==ui->label_2)
    {
        if(ev->type()==QEvent::MouseButtonPress)
        {
            //类型装换
            QMouseEvent *ev=static_cast<QMouseEvent *>(ev);
            QString str=QString("事件过滤器拦截了鼠标点击");
            qDebug()<<str;
            return true;//true代表用户自主处理事件,不想下分发事件
        }
    }
    return QWidget::eventFilter(obj,ev);
}

在这里插入图片描述
??
??
??
??
??
??
??
??
??

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:05:26  更:2022-03-30 18:05:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:12:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码