事件分发器——event()函数

事件过滤

事件进入窗口之前被拦截 eventFilter

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDebug> MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
// 给MyLabel 安装事件过滤器
// 参数 谁来过滤label 的事件
ui->mylabel->installEventFilter(this);
ui->label_2->installEventFilter(this);
} MyWidget::~MyWidget()
{
delete ui;
} void MyWidget::mousePressEvent(QMouseEvent *)
{
qDebug() << "+++++++++++++";
} bool MyWidget::eventFilter(QObject *obj, QEvent *e)
{
// 判断对象
if (obj == ui->mylabel) {
// 过滤事件
if (e->type() == QEvent::MouseMove)
{
ui->mylabel->setText("++++++++++");
return true;
}
}
if (obj == ui->label_2) {
if (e->type() == QEvent::MouseMove)
{
ui->label_2->setText("**********");
return true;
}
}
// 执行默认处理
return QWidget::eventFilter(obj,e);
}

mywidget.cpp

#include "mylabel.h"
#include <QMouseEvent>
#include <QTimerEvent>
#include <QTimer>
#include <QEvent> // QWidget 默认是不追踪鼠标事件的
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
// 设置窗口追踪鼠标键
this->setMouseTracking(true); // 启动定时器
// 参数 1: 触发定时器的时间, 单位: ms
// 参数2: 使用默认值
// 返回值: 定时器ID
id = startTimer();
id1 = startTimer(); // 第二种定时器用法
// QTimer * timer = new QTimer(this);
// timer->start(100);
// connect(timer, &QTimer::timeout, this, [=]()
// {
// static int number = 0;
// this->setText(QString::number(number++));
// }); } // 进入还是离开边界的一瞬间来完成的
// 鼠标进入
void MyLabel::enterEvent(QEvent *)
{
setText("你不要在我身上乱摸!!!!");
} // 鼠标离开
void MyLabel::leaveEvent(QEvent *)
{
setText("终于离开了...");
} void MyLabel::mousePressEvent(QMouseEvent *ev)
{
// 字符串拼接 QString().arg()
// %1, %2, %3 -- 占位符
QString btn;
if(ev->button() == Qt::LeftButton)
{
btn = "LeftButton";
}
else if(ev->button() == Qt::RightButton)
{
btn = "RightButton";
}
else if(ev->button() == Qt::MidButton)
{
btn = "MidButton";
}
QString str = QString("MousePree[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn); setText(str);
} void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
QString btn;
if(ev->button() == Qt::LeftButton)
{
btn = "LeftButton";
}
else if(ev->button() == Qt::RightButton)
{
btn = "RightButton";
}
else if(ev->button() == Qt::MidButton)
{
btn = "MidButton";
}
QString str = QString("MouseRelease[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn); setText(str);
} void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
QString btn;
if(ev->buttons() & (Qt::LeftButton | Qt::RightButton))
{
btn = "LeftButton";
}
else if(ev->buttons() & Qt::RightButton)
{
btn = "RightButton";
}
else if(ev->buttons() & Qt::MidButton)
{
btn = "MidButton";
}
QString str = QString("MouseMove[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn); setText(str);
} // 每触发一次定时器, 进入该函数中
void MyLabel::timerEvent(QTimerEvent *e)
{
QString str;
if(e->timerId() == id)
{
static int num = -;
str = QString("%1: %2").arg("Time out: ").arg(num++);
if(num >= )
{
// 关闭定时器
killTimer(id);
} }
else if(e->timerId() == id1)
{
static int num1 = ;
str = QString("%1: %2").arg("Time out: ").arg(num1++);
if(num1 >= +)
{
// 关闭定时器
killTimer(id1);
}
} setText(str);
} bool MyLabel::event(QEvent *e)
{
// 返回值
// true -- 代表事件被处理了,不再继续下发,停止了
// false -- 事件没有被处理,会继续向下分发
// 大概的处理步骤
// switch(e->type()){
// case QEvent::MouseMove:
// mouseMoveEvent(e);
// break;
// case QEvent::Timer:
// timerEvent(e);
// break;
// } // 过滤定时器事件
if (e->type() == QEvent::Timer) {
return true;// return false,将事件抛给父类
}
// else if (e->type() == QEvent::MouseMove) {
// return true;
// }
else if (e->type() == QEvent::MouseButtonPress) {
return false;
}
// 让父类执行默认的处理
return QLabel::event(e);
}

mylabel.cpp

#ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget> namespace Ui {
class MyWidget;
} class MyWidget : public QWidget
{
Q_OBJECT public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
void mousePressEvent(QMouseEvent *);
bool eventFilter(QObject *obj, QEvent *e);
private:
Ui::MyWidget *ui;
}; #endif // MYWIDGET_H

mywidget.h

#ifndef MYLABEL_H
#define MYLABEL_H #include <QWidget>
#include <QLabel> class MyLabel : public QLabel
{
Q_OBJECT
public:
explicit MyLabel(QWidget *parent = nullptr);
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
void timerEvent(QTimerEvent *e);
bool event(QEvent *e);
private:
int id;
int id1;
signals: public slots:
}; #endif // MYLABEL_H

mylabel.h

(十三)事件分发器——event()函数,事件过滤的更多相关文章

  1. QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息

    Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...

  2. cocos2d JS 自定义事件分发器(接收与传递数据) eventManager

    简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...

  3. MySQL事件调度器Event Scheduler

    我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...

  4. Android事件分发机制三:事件分发工作流程

    前言 很高兴遇见你~ 本文是事件分发系列的第三篇. 在前两篇文章中,Android事件分发机制一:事件是如何到达activity的? 分析了事件分发的真正起点:viewRootImpl,Activit ...

  5. MySQL计划任务(事件调度器)(Event Scheduler)

    http://www.cnblogs.com/c840136/articles/2388512.html https://dev.mysql.com/doc/refman/5.7/en/events- ...

  6. MySQL事件调度器event的使用

    Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...

  7. MySQL计划任务(事件调度器)(Event Scheduler)[转]

    原文链接: http://www.cnblogs.com/c840136/articles/2388512.html MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机 ...

  8. Android事件分发机制一:事件是如何到达activity的?

    事件分发,真的一定从Activity开始吗? 前言 很高兴遇见你~ 事件分发,android中一个老生常谈的话题了.基本的流程我们也都知道是从Activity开始分发,但有一个关键问题是:事件是如何到 ...

  9. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

随机推荐

  1. IDEA 安装配置可视化 MongDB 插件

    IDEA 安装配置可视化 MongDB 插件 1.安装MongoDB插件 打开 IDEA ,file --> settings --> plugins,在右边搜索栏中输入Mongo,点击 ...

  2. W3C 代码标准规范

    W3C通过设立领域(Domains)和标准计划(Activities)来组织W3C的标准活动,围绕每个标准计划,会设立相关的W3C工作组织(包括工作组.社区组.商务组等).W3C会根据产业界的标准需求 ...

  3. (四) Keras Dropout和正则化的使用

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 使用drop ...

  4. umijs开发实践-不同页面交叉使用dva中的modal文件导致的错误

    最近在使用umijs进行H5开发工作,在开发的过程中踩了一些坑,在这里记录一下. 1:按需加载在现在是很常见的优化方式了,我在.umirc.js中开启dynamicImport后,运行umi buil ...

  5. Python:当你遇到了the package “public”?

    前几天跑github上的一个python项目,先都是看看需要哪些模块哪些包,安装配置好环境的.可是看到 import public我眉头一皱,觉得事情并不简单! 所以准备扒一扒!当然项目需要也是真的哈 ...

  6. Linux下LANMP集成环境中编译增加pdo_odbc模块

    linux版本为CentOs6.5,php集成环境为lanmp_v3.1,集成环境中默认的pdo扩展为:mysql, sqlite, sqlite2,现在有需求想链接微软的Access数据库,所以需要 ...

  7. ES入门REST API

    在ES中存在4种数据对象,分别是 index  ,  type ,  document  , field .   其跟我们熟悉的关系型数据库得二维表得对应关系为: index -> table表 ...

  8. ASP.Net Core开发(踩坑)指南

    ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...

  9. 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改

    Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...

  10. php中curl返回false的解决办法

    本文介绍一下自己在使用curl中遇到的问题解决办法.希望可以帮助到大家. 原文地址:代码汇个人博客 http://www.codehui.net/info/37.html 首先来看一个封装的curl函 ...