我是靠谱客的博主 天真小懒猪,最近开发中收集的这篇文章主要介绍事件分发器——event()函数(事件过滤)事件分发器——event()函数事件过滤事件进入窗口之前被拦截eventFilter,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
事件分发器——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);
}
#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(2000);
id1 = startTimer(3000);
// 第二种定时器用法
// 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 = -100;
str = QString("%1: %2").arg("Time out: ").arg(num++);
if(num >= 100)
{
// 关闭定时器
killTimer(id);
}
}
else if(e->timerId() == id1)
{
static int num1 = 10000;
str = QString("%1: %2").arg("Time out: ").arg(num1++);
if(num1 >= 10000+1000)
{
// 关闭定时器
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);
}
#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
#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
最后
以上就是天真小懒猪为你收集整理的事件分发器——event()函数(事件过滤)事件分发器——event()函数事件过滤事件进入窗口之前被拦截eventFilter的全部内容,希望文章能够帮你解决事件分发器——event()函数(事件过滤)事件分发器——event()函数事件过滤事件进入窗口之前被拦截eventFilter所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复