QEvent::Enter
鼠标进入事件,当鼠标进入到窗口/控件内部时,触发该事件,它对应的子类是QEnterEvent
QEvent::Leave
鼠标离开事件,当鼠标离开到窗口/控件内部时,触发该事件
1. 通过自定义控件实现
自定义一个标签控件LabelX
,让它继承自QLabel
,然后重写父类的enterEvent
和leaveEvent
。
1.1 添加自定义控件类LabelX
代码如下:
// 在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. 通过事件过滤器实现
给一个目标对象,安装一个事件过滤器对象,语法如下:文章来源:https://www.toymoban.com/news/detail-821661.html
monitoredObj->installEventFilter(filterObj);
这样:文章来源地址https://www.toymoban.com/news/detail-821661.html
- 所有发向
monitoredObj
的事件,都会被filterObj
截获/过滤 - 截获/过滤的位置是
filterObj
的eventFilter()
函数中 -
eventFilter()
函数返回一个bool
类型,返回true
表示事件被截获,不再发送给monitoredObj
,返回false
表示事件会接着传递给monitoredObj
2.1 添加一个QLabel
lbl = new QLabel(this);
2.2 为QLabel安装事件过滤器
// 为lbl标签安装事件过滤器
lbl->installEventFilter(this);
2.3 重写eventFilter 函数
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);
}
到了这里,关于Qt 鼠标进入离开事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!