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"
            "}"));
    }
}

 

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