自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:
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" "}")); } }