背景:
由于Qt自带的tooltip不是特别美观,于是想到自定义一个tooltip。
1.自定义ToolTip类。
1.1 该类继承于QWidget,主要设置属性如下:
setWindowFlag(Qt::Popup);
setWindowFlag(Qt::FramelessWindowHint);
setMouseTracking(true);
setFocusPolicy(Qt::NoFocus);
setAttribute(Qt::WA_TranslucentBackground);
1.2 重写以下函数:
void exec(QWidget* w);
void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
1.3 函数具体实现:
void CustomTooltip::exec(QWidget* w)
{
if (!w)
return;
this->move(w->mapToGlobal({0, -(w->height())}));
this->show();
this->setFocusProxy(w);
managedWidget = w;
QEventLoop l;
loop = &l;
l.exec();
}
void CustomTooltip::mousePressEvent(QMouseEvent *event)
{
loop->quit();
event->setAccepted(true);
emit signalOver();
QWidget::mousePressEvent(event);
}
void CustomTooltip::mouseMoveEvent(QMouseEvent *event)
{
if (!managedWidget->rect().contains(managedWidget->mapFromGlobal(event->globalPos())) && (this->isVisible() && !this->rect().contains(event->pos()))) {
loop->quit();
}
event->setAccepted(true);
}
2.调用方式
2.1在调用的类中,重写以下函数:
bool eventFilter(QObject* watched, QEvent* event) override;
2.2 在该类的构造函数中,注册事件过滤器:
tipButton->installEventFilter(this);
2.3 在eventFilter函数中进行如下处理:
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if (watched == btn2) {
if ( event->type() == QEvent::ToolTip) {
qDebug()<<"tooltip..............";
if ( isShow ) {
CustomPopup popup(btn2);
connect(&popup , &CustomPopup::signalOver , this , [=](){ isShow = false;});
popup.exec(btn2);
}
return true;
}
if (event->type() == QEvent::Enter) {
qDebug()<<"enter...";
isShow = true;
}
}
return QWidget::eventFilter(watched, event);
}
至此完成自定义tip功能。