星星博客 »  > 

Qt实现移动端Toast提示消息

先上具体的实现效果图:
在这里插入图片描述
弹出提示后,提示框在一定时间内消失。


程序

程序头文件定义:

/** @file   Toast.h
 *  @brief  Qt模拟安卓移动客户端Toast提示消息
 *  @note   qss set in ui file
 *  @author lesliefish
 *  @date   2019/05/31
 */
#pragma once

#include <QtWidgets/QWidget>
#include “ui_Toast.h”

class Toast : public QWidget
{
Q_OBJECT

public:
Toast(QWidget *parent = Q_NULLPTR);
~Toast();

void setText(const QString&amp; text);

void showAnimation(int timeout = 2000);// 动画方式show出,默认2秒后消失

public:
// 静态调用
static void showTip(const QString& text, QWidget* parent = nullptr);

protected:
virtual void paintEvent(QPaintEvent *event);

private:
Ui::ToastClass ui;
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

cpp文件:

#include "Toast.h"
#include <QPropertyAnimation>
#include <QScreen>
#include <QGuiApplication>
#include <QPainter>
#include <QTimer>
Toast::Toast(QWidget *parent)
QWidget(parent)
{
ui.setupUi(this);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::Tool);// 无边框 无任务栏
setAttribute(Qt::WA_TranslucentBackground, true);   // 背景透明

}

Toast::~Toast()
{
}

void Toast::setText(const QString& text)
{
ui.label->setText(text);
}

void Toast::showAnimation(int timeout /= 2000/)
{
// 开始动画
QPropertyAnimation *animation = new QPropertyAnimation(this, “windowOpacity”);
animation->setDuration(1000);
animation->setStartValue(0);
animation->setEndValue(1);
animation->start();
show();

QTimer::singleShot(timeout, [&amp;]
{
    // 结束动画
    QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
    animation-&gt;setDuration(1000);
    animation-&gt;setStartValue(1);
    animation-&gt;setEndValue(0);
    animation-&gt;start();
    connect(animation, &amp;QPropertyAnimation::finished, [&amp;]
    {
        close();
        deleteLater();// 关闭后析构
    });
});

}

void Toast::showTip(const QString& text, QWidget* parent /= nullptr/)
{
Toast* toast = new Toast(parent);
toast->setWindowFlags(toast->windowFlags() | Qt::WindowStaysOnTopHint); // 置顶
toast->setText(text);
toast->adjustSize(); //设置完文本后调整下大小

// 测试显示位于主屏的70%高度位置
QScreen* pScreen = QGuiApplication::primaryScreen();
toast-&gt;move((pScreen-&gt;size().width() - toast-&gt;width()) / 2, pScreen-&gt;size().height() * 7 / 10);
toast-&gt;showAnimation();

}

void Toast::paintEvent(QPaintEvent *event)
{
QPainter paint(this);
paint.begin(this);
auto kBackgroundColor = QColor(255, 255, 255);
kBackgroundColor.setAlpha(0.0 * 255);// 透明度为0
paint.setRenderHint(QPainter::Antialiasing, true);
paint.setPen(Qt::NoPen);
paint.setBrush(QBrush(kBackgroundColor, Qt::SolidPattern));//设置画刷形式
paint.drawRect(0, 0, width(), height());
paint.end();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

测试程序代码:

#include "Toast.h"
#include <QtWidgets/QApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QStringList texts{};
texts &lt;&lt; QStringLiteral("真理惟一可靠的标准就是永远自相符合。")
    &lt;&lt; QStringLiteral("Saying and doing are two different things.")
    &lt;&lt; QStringLiteral("Two heads are better than one.")
    &lt;&lt; QStringLiteral("Time flies.")
    &lt;&lt; QStringLiteral("勿谓言之不预!")
    &lt;&lt; QStringLiteral("Good company on the road is the shortest cut.")
    &lt;&lt; QStringLiteral("Time to go.")
    &lt;&lt; QStringLiteral("It is never too late to learn.")
    &lt;&lt; QStringLiteral("贸易战中国必胜!");

QTimer timer;
QObject::connect(&amp;timer, &amp;QTimer::timeout, [&amp;]
{
    static int i = 0;
    Toast::showTip(texts[i%texts.size()], nullptr);
    i++;
});
Toast::showTip(QString("Let's go."), nullptr);
timer.start(4000);

return app.exec();

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

完整工程源码路径

环境:vs2015+Qt5.9.6
https://github.com/lesliefish/Qt/tree/master/UI/Toast

相关文章