前言
用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示。
源码
头文件
#include <QWidget>
#include <QLabel>
#include <QPaintEvent>
#include <QTimer>
class TLTipsWidget : public QWidget
{
Q_OBJECT
public:
explicit TLTipsWidget(QWidget *parent = 0);
~TLTipsWidget();
void setText(const QString & text);
protected:
void paintEvent(QPaintEvent *e);
void showEvent(QShowEvent *e);
signals:
private slots:
void onTimerStayOut();
void onTimerCloseOut();//渐变后隐藏
private:
QLabel* m_pLabel;
QTimer * m_pTimer;
QTimer * m_pCloseTimer;
qreal m_dTransparent;
};
源文件
#include "tltipswidget.h"
#include <QPainter>
TLTipsWidget::TLTipsWidget(QWidget *parent) :
QWidget(parent),
m_pLabel(NULL),
m_pTimer(NULL),
m_pCloseTimer(NULL),
m_dTransparent(1.0)
{
this->setFixedHeight(55);
m_pLabel = new QLabel(this);
m_pLabel->setFixedHeight(55);
m_pLabel->move(0,0);
m_pLabel->setAlignment(Qt::AlignCenter);
m_pLabel->setStyleSheet("color:white");
this->hide();
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground,true);
m_pTimer = new QTimer();
m_pTimer->setInterval(3000);
m_pCloseTimer = new QTimer();
m_pCloseTimer->setInterval(20);
connect(m_pTimer,&QTimer::timeout,this,&TLTipsWidget::onTimerStayOut);
connect(m_pCloseTimer,&QTimer::timeout,this,&TLTipsWidget::onTimerCloseOut);
}
TLTipsWidget::~TLTipsWidget()
{
delete m_pTimer;
delete m_pCloseTimer;
}
void TLTipsWidget::setText(const QString &text){
QFontMetrics fm(this->font());
int width = fm.width(text) * 1.2;
this->setFixedWidth(width);
m_pLabel->setFixedWidth(width);
this->m_pLabel->setText(text);
this->show();
m_pTimer->start();
}
void TLTipsWidget::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(0,0,0,180));
painter.drawRoundedRect(rect(),5,5);
QWidget::paintEvent(e);
}
void TLTipsWidget::showEvent(QShowEvent *e)
{
QTimer::singleShot(2500,this,SLOT(hide()));
this->move(parentWidget()->width() / 2 - this->width()/2,
(parentWidget()->height()*(1- (172/1120))) / 2 - this->height() / 2);
QWidget::showEvent(e);
}
void TLTipsWidget::onTimerStayOut()
{
m_pTimer->stop();
if(m_pCloseTimer->isActive()){
m_pCloseTimer->stop();
}
m_pCloseTimer->start();
}
void TLTipsWidget::onTimerCloseOut()
{
m_dTransparent -= 0.01;
if(m_dTransparent <= 0.0001)
{
m_pCloseTimer->stop();
this->hide();
m_pLabel->clear();
}
else
{
setWindowOpacity(m_dTransparent);
}
}
实现原理其实很简单,通过定时器来控制显示时间,以及动态改变透明度直到变为0后隐藏即可。不再赘述。