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\n"
            "{\n"
            "    background: #202126;\n"
            "background-image:url(:/preview/Resources/previewanalyze/nodata.png);\n"
            "background-position:center;\n"
            "background-repeat:no-repeat;\n"
            "border:0px;\n"
            "}"));
    }
    else
    {
        ui.listWidgetAlarm->setStyleSheet(QLatin1String("QListWidget#listWidgetAlarm\n"
            "{\n"
            "    background: #202126;\n"
            "border:0px;\n"
            "}"));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章