Qt实现冒泡提示框
通过QLabel创建类似冒泡方式的提示框(提示框显示位置为父类控件居中位置,具体可根据需要自行修改),鼠标停留提示框界面时查看信息,离开时自动淡化消失的效果;
头文件定义
#ifndef _TTipWidget_H_ #define _TTipWidget_H_ class TTipWidget :public QLabel { Q_OBJECT public: static TTipWidget &Instance(); void SetMesseage(const QString &strMessage, const QPoint *pPoint=nullptr); private: TTipWidget(); ~TTipWidget(); void OnTimer(); void enterEvent(QEvent *); void leaveEvent(QEvent *); private: QWidget *mpParent; QTimer *mpTimer; bool mbEnter; int mnTransparent; }; #endif // _TTipWidget_H_
实例实现
#include "TTipWidget.h" TTipWidget::TTipWidget() : mpParent(nullptr) , mbEnter(false) , mnTransparent(200) { setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); setAlignment(Qt::AlignCenter); mpTimer = new QTimer(this); connect(mpTimer, &QTimer::timeout, this, &TTipWidget::OnTimer); } TTipWidget::~TTipWidget() { deleteLater(); } void TTipWidget::enterEvent(QEvent *) { mbEnter = true; mnTransparent = 200; setStyleSheet(QString("color:white;font:12px \"Microsoft YaHei\";border-radius:5px;background-color:rgba(80, 80, 80, %1);").arg(mnTransparent)); } void TTipWidget::leaveEvent(QEvent *) { mbEnter = false; } void TTipWidget::OnTimer() { if (mbEnter) { return; } mnTransparent -= 3; if (mnTransparent > 0) { if (mpParent && parentWidget()) { QPoint pt((parentWidget()->width() - width()) >> 1, (parentWidget()->height() - height()) >> 1); if (pos() != pt) { move(pt); } } setStyleSheet(QString("color:white;font:12px \"Microsoft YaHei\";border-radius:5px;background-color:rgba(80, 80, 80, %1);").arg(mnTransparent)); } else { mpTimer->stop(); setVisible(false); } } void TTipWidget::SetMesseage(const QString &strMessage, const QPoint *pPoint) { if (strMessage.isEmpty()) { return; } QFontMetrics fm1(font()); setFixedSize(fm1.width(strMessage) + 30, 30); mpParent = parentWidget(); if (width() > mpParent->width()) { setFixedSize(mpParent->width() - 60, 60); setWordWrap(true); } else { setWordWrap(false); } setText(strMessage); if (nullptr != mpParent) { if (nullptr != pPoint) { move(mpParent->mapFromGlobal(*pPoint)); mpParent = nullptr; } else { move((mpParent->width() - width()) >> 1, (mpParent->height() - height()) >> 1); } } setVisible(true); mnTransparent = 200; mpTimer->start(30); } TTipWidget &TTipWidget::Instance() { static TTipWidget tipWidget; return tipWidget; }
外部引用
TTipWidget::Instance().setParent(this); //设置实例的引用者 TTipWidget::Instance().setVisible(false); TTipWidget::Instance().SetMesseage(tr("Disappearing tips!")); //提示信息
ps:本博文只用于日常备注及学习交流,请勿用于任何商业用途,涉及网摘等资料如有侵犯原作者权利,请联系确保及时更正!