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

97 lines
3.0 KiB
C++

#include "ElaToolTip.h"
#include <QPainter>
#include <QVBoxLayout>
#include "ElaText.h"
#include "ElaTheme.h"
#include "ElaToolTipPrivate.h"
Q_PROPERTY_CREATE_Q_CPP(ElaToolTip, int, BorderRadius)
Q_PROPERTY_CREATE_Q_CPP(ElaToolTip, int, DisplayMsec)
Q_PROPERTY_CREATE_Q_CPP(ElaToolTip, int, ShowDelayMsec)
Q_PROPERTY_CREATE_Q_CPP(ElaToolTip, int, HideDelayMsec)
ElaToolTip::ElaToolTip(QWidget *parent) : QWidget{parent}, d_ptr(new ElaToolTipPrivate()) {
Q_D(ElaToolTip);
d->q_ptr = this;
d->_pBorderRadius = 5;
d->_pDisplayMsec = -1;
d->_pShowDelayMsec = 0;
d->_pHideDelayMsec = 0;
d->_pCustomWidget = nullptr;
setObjectName("ElaToolTip");
if (parent) {
parent->installEventFilter(d);
}
setAttribute(Qt::WA_TransparentForMouseEvents);
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
d->_toolTipText = new ElaText(this);
d->_toolTipText->setWordWrap(false);
d->_toolTipText->setTextPixelSize(17);
d->_mainLayout = new QVBoxLayout(this);
d->_mainLayout->setContentsMargins(d->_shadowBorderWidth * 2, d->_shadowBorderWidth * 2, d->_shadowBorderWidth * 2, d->_shadowBorderWidth * 2);
d->_mainLayout->addWidget(d->_toolTipText);
d->_themeMode = eTheme->getThemeMode();
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) {
d->_themeMode = themeMode;
update();
});
hide();
}
ElaToolTip::~ElaToolTip() {}
void ElaToolTip::setToolTip(QString toolTip) {
Q_D(ElaToolTip);
resize(fontMetrics().horizontalAdvance(toolTip), height());
d->_toolTipText->setText(toolTip);
Q_EMIT pToolTipChanged();
}
QString ElaToolTip::getToolTip() const {
Q_D(const ElaToolTip);
return d->_toolTipText->text();
}
void ElaToolTip::setCustomWidget(QWidget *customWidget) {
Q_D(ElaToolTip);
if (!customWidget || customWidget == this) {
return;
}
if (d->_pCustomWidget) {
d->_mainLayout->removeWidget(d->_pCustomWidget);
d->_pCustomWidget->deleteLater();
}
d->_toolTipText->hide();
d->_mainLayout->addWidget(customWidget);
d->_pCustomWidget = customWidget;
Q_EMIT pCustomWidgetChanged();
}
QWidget *ElaToolTip::getCustomWidget() const {
Q_D(const ElaToolTip);
return d->_pCustomWidget;
}
void ElaToolTip::updatePos() {
Q_D(ElaToolTip);
d->_updatePos();
}
void ElaToolTip::paintEvent(QPaintEvent *event) {
Q_D(ElaToolTip);
QPainter painter(this);
painter.save();
painter.setRenderHint(QPainter::Antialiasing);
// 阴影
eTheme->drawEffectShadow(&painter, rect(), d->_shadowBorderWidth, d->_pBorderRadius);
QRect foregroundRect = rect();
foregroundRect.adjust(d->_shadowBorderWidth, d->_shadowBorderWidth, -d->_shadowBorderWidth, -d->_shadowBorderWidth);
painter.setPen(ElaThemeColor(d->_themeMode, PopupBorder));
painter.setBrush(ElaThemeColor(d->_themeMode, PopupBase));
painter.drawRoundedRect(foregroundRect, d->_pBorderRadius, d->_pBorderRadius);
painter.restore();
}