• QListWidget内部多个图片不同延时显示动画


    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

    https://www.cnblogs.com/bclshuai/p/11380657.html

    1.应用场景

    如下图所示的QListWidget列表展示比对结果,现在要求里面的每个小控件显示时候有一定的延时,第一张延时0ms,第二张延时30ms,第三张延时60ms,第四张延时90ms,延时后显示透明度从0到1,缩放大小0.8-1.达到一种渐现和缩放的动画效果;

    2.实现步骤

    2.1自定义QListWidget内部控件

    头文件

    #pragma once
    
    #include <QWidget>
    #include "ui_AlarmItem.h"
    #include <QGraphicsOpacityEffect>
    #include <QPropertyAnimation>
    #include <QPauseAnimation>
    #include <QParallelAnimationGroup>
    #include <QSequentialAnimationGroup>
    class AlarmItem : public QWidget
    {
        Q_OBJECT
    
    public:
        AlarmItem();
        ~AlarmItem();
        void SetData(QVariantMap& info);
        void StartAnimotion(int delaytime=0);
        QVariantMap GetData() { return m_info; };
    signals:
        void signalZoomPic(QVariantMap info);
    private:
        Ui::AlarmItem ui;
        QVariantMap m_info;
        
    };

    源文件

    #include "AlarmItem.h"
    #pragma execution_character_set("utf-8")
    AlarmItem::AlarmItem()
    {
        ui.setupUi(this);
        setWindowModality(Qt::NonModal);
        setWindowFlags(Qt::FramelessWindowHint);
        setWindowOpacity(0);
        //setAttribute(Qt::WA_TranslucentBackground);
        connect(ui.pBZoomPic, &QPushButton::clicked, this, [=]() {
            QVariantMap info;
            info.insert("target", m_info.value("target"));
            info.insert("relate", m_info.value("grap"));
            info.insert("time", m_info.value("time"));
            info.insert("location", m_info.value("location"));
            info.insert("type", m_info.value("type").toString());
            emit signalZoomPic(info);
        });
        
    }
    
    AlarmItem::~AlarmItem()
    {
    
    }
    
    void AlarmItem::SetData(QVariantMap & info)
    {
        m_info = info;
        
        if (info.value("type").toString()=="face")
        {
            ui.labelSimlarity->setText(info.value("similarity").toString()+"%");
            ui.labelCarNum->hide();
            QPixmap pix(info.value("target").toString());
            pix = pix.scaled(ui.labelTargetPic->size(), Qt::KeepAspectRatio);
            ui.labelTargetPic->setPixmap(pix);
            ui.labelSimlarity->show();
            ui.labelType->setText("人脸布控");
        }
        else
        {
            ui.labelSimlarity->hide();
            ui.labelCarNum->show();
            ui.labelCarNum->setText(info.value("target").toString());
            ui.labelType->setText("车辆布控");
        }
        QPixmap gpix(info.value("grap").toString());
        gpix = gpix.scaled(ui.labelGraph->size(), Qt::KeepAspectRatio);
        ui.labelGraph->setPixmap(gpix);
        ui.labelLocation->setText(info.value("location").toString());
        ui.labelTime->setText(info.value("time").toString());
    }
    
    void AlarmItem::StartAnimotion(int delaytime)
    {
        //延迟
        QPauseAnimation *pPauseAnimation = new QPauseAnimation(this);
        pPauseAnimation->setDuration(delaytime);
        //透明度
        QGraphicsOpacityEffect* widgetOpacity = NULL;
        QPropertyAnimation* pWidgetAnimationOpacity = NULL;
        widgetOpacity = new  QGraphicsOpacityEffect(this);//创建QGraphicsOpacityEffect对象关联控件ui.widgetProcess
        widgetOpacity->setOpacity(0);//设置透明度为0,隐藏控件
        this->setGraphicsEffect(widgetOpacity);//控件添加绘图效果
        pWidgetAnimationOpacity = new QPropertyAnimation(widgetOpacity, "opacity", this);
        pWidgetAnimationOpacity->setDuration(300);
        pWidgetAnimationOpacity->setStartValue(0);
        pWidgetAnimationOpacity->setEndValue(1);
        pWidgetAnimationOpacity->setEasingCurve(QEasingCurve::Linear);
        //缩放
        QPropertyAnimation * pWidgetProcessUp = new QPropertyAnimation(this, "size");
        pWidgetProcessUp->setDuration(300);//设置动画执行时间,单位毫秒
        pWidgetProcessUp->setStartValue(QSize( 244, 200));//初始值
        pWidgetProcessUp->setEndValue(QSize(306, 250));//结束值
        pWidgetProcessUp->setEasingCurve(QEasingCurve::Linear);// 设置速度曲线
    
        QParallelAnimationGroup* paragroup = new QParallelAnimationGroup(this);
        paragroup->addAnimation(pWidgetAnimationOpacity);
        paragroup->addAnimation(pWidgetProcessUp);
    
        QSequentialAnimationGroup* SequentialGroup = new QSequentialAnimationGroup(this);
        SequentialGroup->addAnimation(pPauseAnimation);
        SequentialGroup->addAnimation(paragroup);
    
        SequentialGroup->start(QAbstractAnimation::KeepWhenStopped);
    }

    2.2 在主程序中新建对象插入QListWidget中,设置不同的延时时间

    void FaceMatch::SlotResponseQueryAlarm(int errorCode, QString Message, QVariantMap & info)
    {
        QVariantList list = info.value("data").toList();
        ui.listWidgetAlarm->clear();
        QListWidgetItem* pItem = NULL;
        AlarmItem* pAlarm = NULL;
        for (int i=0;i<list.size();i++)
        {
            pItem = new QListWidgetItem();
            pAlarm = new AlarmItem();
            connect(pAlarm, &AlarmItem::signalZoomPic, this, &FaceMatch::SlotShowZoomWindow);
            pAlarm->SetData(list.at(i).toMap());
            pItem->setSizeHint(QSize(306, 250));//设一项的大小
            pAlarm->StartAnimotion(i * 30);//启动动画
            ui.listWidgetAlarm->addItem(pItem);
            ui.listWidgetAlarm->setItemWidget(pItem, pAlarm);
            
        }
        ui.listWidgetAlarm->update();
        ui.pageAlarm->setNumberOnly(info.value("totalCount").toULongLong());
        if (ui.listWidgetAlarm->count()==0)
        {
            ui.listWidgetAlarm->setStyleSheet(QLatin1String("QListWidget#listWidgetAlarm
    "
                "{
    "
                "    background: #202126;
    "
                "background-image:url(:/preview/Resources/previewanalyze/nodata.png);
    "
                "background-position:center;
    "
                "background-repeat:no-repeat;
    "
                "border:0px;
    "
                "}"));
        }
        else
        {
            ui.listWidgetAlarm->setStyleSheet(QLatin1String("QListWidget#listWidgetAlarm
    "
                "{
    "
                "    background: #202126;
    "
                "border:0px;
    "
                "}"));
        }
    }
    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html
  • 相关阅读:
    【最短路】The 2019 Asia Nanchang First Round Online Programming Contest Fire-Fighting Hero (Dijkstra)
    【积累】The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item (矩阵快速幂 k进制快速幂)
    【线段树】The Preliminary Contest for ICPC Asia Xuzhou 2019 Colorful String(回文树+线段树+状压/bitset)
    allure参数说明及代码示例
    Idea+maven+testng+reportng生成测试报告
    ubuntu 16.04 镜像下载
    new AndroidDriver报错java.lang.NoSuchMethodError: com.google.common.base.Throwables.throwIfUnchecked
    Appium常用的API
    Appium常用的定位方法
    adb 指令总结
  • 原文地址:https://www.cnblogs.com/bclshuai/p/15342852.html
Copyright © 2020-2023  润新知