• QT中的QPropertyAnimation使用和toast案列



    0 引入

    最近使用学习到动画这一块,无意中接触到使用QPropertyAnimation来完成 类似 toast效果的东西


    在这里插入图片描述
    主要功能:
    1、toast实现位置可以根据父窗口而改变;
    2、显示时间默认是一分钟,可调

    1、QPropertyAnimation自带效果

    QPropertyAnimation是Qt自带的动画类,该类可以实现简单的控件动画效果,比如对控件的移动、缩放、不透明度这些来做动画效果(使用某效果之前需要使用setPropertyName函数指定需要的动画属性名,以下三个是Qt已经定义好的)。

    1、移动(pos):主要实现移动效果,如从某个点移动到另一个点,所使用的变量类型为QPoint等。
    2、缩放(geometry):可实现缩放和移动效果,该属性可以实现指定控件的缩放,并且在缩放的基础上还能实现移动。
    3、不透明度(windowOpacity):实现控件的透明度设置(不过该属性只能对顶级窗口使用,对普通控件这些无效)。


    2、QPropertyAnimation自定义效果

    见引用。

    3、QPropertyAnimation toast实现

    1.toast头文件

    代码如下(示例):

    #ifndef TOAST_H
    #define TOAST_H
    
    #include <QtWidgets/QWidget>
    #include <QLabel>
    
    
    class Toast : public QWidget
    {
        Q_OBJECT
    public:
        Toast(QWidget *parent = Q_NULLPTR);
        ~Toast();
    
        void setText(const QString& text);
        void showAnimation(int timeout = 500);
        void movetoPosition(int x,int y);
        static void showTip(const QString& text,int x,int y,QWidget* parent = nullptr);
    
    private:
        QLabel *label = nullptr;
        QWidget *widget = nullptr;
    };
    
    #endif // TOAST_H
    
    • 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

    2.toast cpp

    代码如下(示例):

    #include "toast.h"
    #include <QPropertyAnimation>
    #include <QScreen>
    #include <QGuiApplication>
    #include <QPainter>
    #include <QTimer>
    #include <QDebug>
    #include <QGridLayout>
    
    Toast::Toast(QWidget *parent)
        : QWidget(parent)
    {
    
        label = new QLabel();
        label->setStyleSheet("background-color: rgba(0,0,0,0.80);\nborder-radius: 26px;\ncolor: #FFFFFF;\nfont-family: microsoft yahei;\nfont-size: 16px;\npadding-left:25px;\npadding-right:25px;");
        QGridLayout *layout = new QGridLayout;
        layout->addWidget(label);
    
        widget = new QWidget();
        widget->setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::Tool);
        widget->setAttribute(Qt::WA_TranslucentBackground, true);
    
        widget->setGeometry(0,0,170,52);
        widget->setLayout(layout);
    
        QScreen* pScreen = QGuiApplication::primaryScreen();
        widget->move((pScreen->size().width() - widget->width()) / 2, pScreen->size().height() /2);
        widget->setVisible(true);
    }
    
    Toast::~Toast()
    {
        delete label;
        delete widget;
    }
    
    void Toast::setText(const QString& text)
    {
        label->setText(text);
    }
    
    void Toast::showAnimation(int timeout)
    {
        QTimer::singleShot(timeout, [&]
        {
            QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
            animation->setDuration(500);
            animation->setStartValue(1);
            animation->setEndValue(0);
            animation->start();
            connect(animation, &QPropertyAnimation::finished, [&]
            {
                close();
                deleteLater();
            });
        });
    }
    
    void Toast::movetoPosition(int x,int y)
    {
        widget->move(x,y);
    }
    
    void Toast::showTip(const QString& text ,int x,int y,QWidget* parent /*= nullptr*/)
    {
        Toast* toast = new Toast(parent);
        toast->setWindowFlags(toast->windowFlags() | Qt::WindowStaysOnTopHint);
        toast->setText(text);
        toast->adjustSize();
        toast->movetoPosition(x, y);
        toast->showAnimation();
    }
    
    
    • 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

    3.main cpp

    void MainWindow::on_pushButton_4_clicked()
    {
    
       Toast::showTip("测试成功!测试成功!测试成功!测试成功!测试成功!",this->x(),this->y());
    }
    
    
    void MainWindow::on_pushButton_5_clicked()
    {
        qDebug()<<"12";
     //   Toast::showTip(QApplication::translate("Dialog", "Please set destination IP !"));
         Toast::showTip("测试成功!",this->x(),this->y());
        qDebug()<<"123";
    }void MainWindow::on_pushButton_4_clicked()
    {
    
       Toast::showTip("测试成功!测试成功!测试成功!测试成功!测试成功!",this->x(),this->y());
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3、总结

    文章参考引用的内容,然后自己实现一个toast,只需要包含头文件和cpp就可以在程序中使用了


    4、引用

    1、QT自定义属性动画
    2、QT实现toast效果


  • 相关阅读:
    第三篇,芯片启动和时钟系统
    IDEA自定义注释模版
    Python 基本数据类型 索引和截取终极理解 步长的理解
    2022年已经过去一半了,是不是很突然呢?
    c++ 指针
    django的orm框架基础使用
    Linux下 coredump 文件定位方法说明
    域名解析中的A记录和CNAME什么意思
    设计循环双端队列
    OpenMMLap之Hook机制详解
  • 原文地址:https://blog.csdn.net/ljsant/article/details/125507765