? 鼠标进入事件,当鼠标进入到窗口/控件内部时,触发该事件,它对应的子类是QEnterEvent
QEvent::Leave
? 鼠标离开事件,当鼠标离开到窗口/控件内部时,触发该事件
自定义一个标签控件LabelX
,让它继承自QLabel
,然后重写父类的enterEvent
和leaveEvent
。
代码如下:
// 在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++));
}
给一个目标对象,安装一个事件过滤器对象,语法如下:
monitoredObj->installEventFilter(filterObj);
这样:
monitoredObj
的事件,都会被filterObj
截获/过滤filterObj
的eventFilter()
函数中eventFilter()
函数返回一个bool
类型,返回true
表示事件被截获,不再发送给monitoredObj
,返回false
表示事件会接着传递给monitoredObj
lbl = new QLabel(this);
// 为lbl标签安装事件过滤器
lbl->installEventFilter(this);
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);
}