Qt QWidget实现消息提示控件TipsWidget

138 篇文章 196 订阅

前言

用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后隐藏即可。不再赘述。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值