文章目录
- [1. 通过自定义控件实现](#1. 通过自定义控件实现)
-
- [1.1 添加自定义控件类LabelX](#1.1 添加自定义控件类LabelX)
- [2. 通过事件过滤器实现](#2. 通过事件过滤器实现)
-
- [2.1 添加一个QLabel](#2.1 添加一个QLabel)
- [2.2 为QLabel安装事件过滤器](#2.2 为QLabel安装事件过滤器)
- [2.3 重写eventFilter 函数](#2.3 重写eventFilter 函数)
QEvent::Enter
鼠标进入事件,当鼠标进入到窗口/控件内部时,触发该事件,它对应的子类是QEnterEvent
QEvent::Leave
鼠标离开事件,当鼠标离开到窗口/控件内部时,触发该事件
1. 通过自定义控件实现
自定义一个标签控件LabelX
,让它继承自QLabel
,然后重写父类的enterEvent
和leaveEvent
。
1.1 添加自定义控件类LabelX
代码如下:
c++
// 在LabelX.h 中
#ifndef LABELX_H
#define LABELX_H
#include <QDebug>
#include <QLabel>
class LabelX : public QLabel {
Q_OBJECT
public:
explicit LabelX(QWidget *parent = nullptr);
protected:
// 重写父类的方法
void enterEvent(QEnterEvent *event);
void leaveEvent(QEvent *event);
signals:
};
#endif // LABELX_H
// 在LabelX.cpp 中
#include "labelx.h"
LabelX::LabelX(QWidget *parent) : QLabel{parent} {}
static int cnt = 1;
void LabelX::enterEvent(QEnterEvent *event) {
Q_UNUSED(event);
// qDebug() << "enterEvent: " << cnt++;
this->setText(QString("enterEvent: %1").arg(cnt++));
}
void LabelX::leaveEvent(QEvent *event) {
Q_UNUSED(event);
// qDebug() << "leaveEvent: " << cnt++;
this->setText(QString("leaveEvent: %1").arg(cnt++));
}
2. 通过事件过滤器实现
给一个目标对象,安装一个事件过滤器对象,语法如下:
c++
monitoredObj->installEventFilter(filterObj);
这样:
- 所有发向
monitoredObj
的事件,都会被filterObj
截获/过滤 - 截获/过滤的位置是
filterObj
的eventFilter()
函数中 eventFilter()
函数返回一个bool
类型,返回true
表示事件被截获,不再发送给monitoredObj
,返回false
表示事件会接着传递给monitoredObj
2.1 添加一个QLabel
c++
lbl = new QLabel(this);
2.2 为QLabel安装事件过滤器
c++
// 为lbl标签安装事件过滤器
lbl->installEventFilter(this);
2.3 重写eventFilter 函数
c++
static int cnt = 1;
// 安装事件过滤器
bool EnterLeaveWidget::eventFilter(QObject *obj, QEvent *event) {
if (obj == lbl) {
// 判断事件的类型
if (event->type() == QEvent::Enter) {
lbl->setText(QString("enterEvent: %1").arg(cnt++));
} else if (event->type() == QEvent::Leave) {
lbl->setText(QString("leaveEvent: %1").arg(cnt++));
}
}
// 其他事件交给父类处理
return QWidget::eventFilter(obj, event);
}