Files
cbh/ElaWidgetTools/private/ElaToolTipPrivate.cpp
2025-09-20 01:41:33 +08:00

58 lines
1.6 KiB
C++

#include "ElaToolTipPrivate.h"
#include <QEvent>
#include <QPropertyAnimation>
#include <QTimer>
#include "ElaToolTip.h"
ElaToolTipPrivate::ElaToolTipPrivate(QObject *parent) : QObject{parent} { _pOpacity = 1; }
ElaToolTipPrivate::~ElaToolTipPrivate() {}
bool ElaToolTipPrivate::eventFilter(QObject *watched, QEvent *event) {
Q_Q(ElaToolTip);
switch (event->type()) {
case QEvent::Enter: {
QTimer::singleShot(_pShowDelayMsec, this, [=]() { _doShowAnimation(); });
if (_pDisplayMsec > -1) {
QTimer::singleShot(_pDisplayMsec, this, [=]() { q->hide(); });
}
break;
}
case QEvent::Leave: {
QTimer::singleShot(_pHideDelayMsec, this, [=]() { q->hide(); });
break;
}
case QEvent::HoverMove:
case QEvent::MouseMove: {
_updatePos();
break;
}
default: {
break;
}
}
return QObject::eventFilter(watched, event);
}
void ElaToolTipPrivate::_doShowAnimation() {
Q_Q(ElaToolTip);
QPoint cursorPoint = QCursor::pos();
q->move(cursorPoint.x() + 10, cursorPoint.y());
q->show();
QPropertyAnimation *showAnimation = new QPropertyAnimation(q, "windowOpacity");
showAnimation->setEasingCurve(QEasingCurve::InOutSine);
showAnimation->setDuration(250);
showAnimation->setStartValue(0);
showAnimation->setEndValue(1);
showAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
void ElaToolTipPrivate::_updatePos() {
Q_Q(ElaToolTip);
if (q->isVisible()) {
QPoint cursorPoint = QCursor::pos();
q->move(cursorPoint.x() + 10, cursorPoint.y());
}
}