QT5实现数组滚动角标样式图文教程

0 429
索鸟 2021-03-11
需要:0索币

1.1.1         应用场景说明

如下图所示,需要显示人脸检测的数量,变动画的方式实现个位数字滚动,个位由9变成0时,十位也要滚动,实现进位。当个位十位都是9时,数字不在增加,而是显示加号+。

 

 

 

 

  

1.1.2         实现方法

实现方案,个位十位都有上下两个label显示数字。通过QPropertyAnimation属性动画控制两个label位置同时向上。动画结束后,再将两个label还原到原始位置。在还原位置之前,先前上面的labelnum值设置为下面labelnum1的值,下面labelnum1的值设置为+1后的值,避免出现数字闪现变小的问题。

 

头文件实现

 

 

#ifndef NUMSHOWWIDGET_H

#define NUMSHOWWIDGET_H

#include <QPropertyAnimation>

#include<QParallelAnimationGroup>

#include <QSequentialAnimationGroup>

#include <QWidget>

#include"ui_NumShowWidget.h"

#include<QMutex>

#include<QWaitCondition>

#include<QTimer>

class NumShowWidget : public QWidget

{

    Q_OBJECT

 

public:

    NumShowWidget();

    ~NumShowWidget();

    void initNum();//个位十位上下初始化0,1值

    /*

    设置为某个值,会根据数字增量的大小增加数字值,根据time求出平均动画时间步长。增量大时速度快,增量小时速度慢

    */

    void setNum(int num,int time);

    void addNum(int num, int time);

    public slots:

    void SlotTimeAddNum();

    int getNum();

    void pushNum(int num);

private:

    Ui::NumShowWidget ui;

    int m_tenwei = 0;//十位

    int m_gewei = 0;//个位

    QLabel* m_tenCurrent = NULL;//十位当前label

    QLabel* m_tenDown=NULL;//十位下面的label

    QLabel* m_geCurrent = NULL;//个位当前label

    QLabel* m_geDown = NULL;//个位下面的label

    int m_count = 0;//动画执行的次数,增量为10,则执行十次上滚动画

    int m_num=0;//保存当前显示的数字。

    QParallelAnimationGroup* tenAnimation;

    QMutex m_mutex;

    QWaitCondition m_FinishAnimation;

    QTimer m_checktime;

    QMutex m_addNumMutex;

    QVector<int> m_vectNum;

    bool m_bFinishAni=true;//避免第一次动画未执行结束,第二次动画就开始,会错乱,所加上一个判断条件。

    QPropertyAnimation * tenCurrent =NULL;

    QPropertyAnimation * tenDown = NULL;

};

#endif // NUMSHOWWIDGET_H

源文件实现

#include "NumShowWidget.h"

#include"hlog1.h"

#include<QFontDatabase>

NumShowWidget::NumShowWidget()

{

    ui.setupUi(this);

    setWindowModality(Qt::NonModal);

    setWindowFlags(Qt::FramelessWindowHint);

    this->resize(32, 32);

    m_tenCurrent = ui.labelten;

    m_tenDown = ui.labelten1;

    m_geCurrent = ui.labelnum;

    m_geDown = ui.labelnum1;

    m_tenCurrent->setText("0");

    m_tenDown->setText("1");

    m_geCurrent->setText("0");

    m_geDown->setText("1");

    ui.labelplus->hide();

    tenAnimation = new QParallelAnimationGroup(this);

    tenCurrent = new QPropertyAnimation(m_tenCurrent, "geometry");

    tenCurrent->setDuration(100);

    tenCurrent->setStartValue(QRect(4, 0, 12, 32));

    tenCurrent->setEndValue(QRect(4, -32, 12, 32));

    tenAnimation->addAnimation(tenCurrent);

    tenDown = new QPropertyAnimation(m_tenDown, "geometry");

    tenDown->setDuration(100);

    tenDown->setStartValue(QRect(4, 32, 12, 32));

    tenDown->setEndValue(QRect(4, 0, 12, 32));

    tenAnimation->addAnimation(tenDown);

    connect(tenAnimation, &QAbstractAnimation::finished, this, [=]() {

        m_tenCurrent->setText(QString::number(m_tenwei++));

        m_tenCurrent->setGeometry(4, 0, 12, 32);

        m_tenCurrent->raise();

        m_tenDown->setGeometry(4, 32, 12, 32);

        m_tenDown->setText(QString::number((m_tenwei + 1)));

    });

    m_checktime.setInterval(1000);

    connect(&m_checktime, &QTimer::timeout, this, &NumShowWidget::SlotTimeAddNum);

    m_checktime.start();

}

 

NumShowWidget::~NumShowWidget()

{

    if (tenAnimation != NULL)

    {

        delete tenAnimation;

        tenAnimation = NULL;

    }

}

 

void NumShowWidget::initNum()

{

    m_tenwei = 1;

    m_gewei = 1;

    m_num = 0;

    m_tenCurrent->setText("0");

    m_tenCurrent->setGeometry(QRect(4, 0, 12, 32));

    m_tenDown->setText("1");

    m_tenDown->setGeometry(QRect(4, 32, 12, 32));

    m_geCurrent->setText("0");

    m_geDown->setText("1");

    m_geCurrent->setGeometry(QRect(15, 0, 12, 32));

    m_geDown->setGeometry(QRect(15, 32, 12, 32));

    ui.labelplus->hide();

    m_vectNum.clear();

    m_bFinishAni = true;

   

}

 

void NumShowWidget::setNum(int num, int time)

{

    if (ui.labelplus->isVisible())

    {

        return;

    }

    m_num = ui.labelten->text().toInt()*10+ui.labelnum->text().toInt();

    if (num <= m_num)//值没有变

    {

        m_mutex.lock();

        m_bFinishAni = true;

        m_mutex.unlock();

        return;

    }

    addNum(num - m_num, time);

}

 

void NumShowWidget::addNum(int num, int time)

{

   

    if (num <= 0)

    {

        return;

    }

    LOG_INFO("NUCOUNT LOCK");

    int steptime = time / num;//动画时间步长

    tenCurrent->setDuration(steptime);

    tenDown->setDuration(steptime);

    m_count = num;

    QParallelAnimationGroup* paraAnimation = new QParallelAnimationGroup(this);

    QPropertyAnimation * geCurrent = new QPropertyAnimation(m_geCurrent, "geometry");

    geCurrent->setDuration(steptime);

    geCurrent->setStartValue(QRect(15, 0, 12, 32));

    geCurrent->setEndValue(QRect(15, -32, 12, 32));

    paraAnimation->addAnimation(geCurrent);

    QPropertyAnimation *geDown = new QPropertyAnimation(m_geDown, "geometry");

    geDown->setDuration(steptime);

    geDown->setStartValue(QRect(15, 32, 12, 32));

    geDown->setEndValue(QRect(15, 0, 12, 32));

    paraAnimation->addAnimation(geDown);

    paraAnimation->start();

    connect(paraAnimation, &QAbstractAnimation::finished, this, [=]() {

        m_count--;

        m_geCurrent->setText(QString::number(m_gewei++));

        m_geCurrent->setGeometry(15, 0, 12, 32);

        m_geCurrent->raise();

        m_geDown->setGeometry(15, 32, 12, 32);

        if (m_gewei >= 10)

        {

             if (m_tenwei < 10)

             {

                 tenAnimation->start();

             }

             else

             {

                 ui.labelplus->show();

                 m_mutex.lock();

                 m_bFinishAni = true;

                 m_mutex.unlock();

                 delete paraAnimation;

                 LOG_INFO("NUCOUNT ULOCK");

                 return;

            }

             m_gewei = 0;

        }

        m_geDown->setText(QString::number((m_gewei) % 10));

        if (m_count > 0)

        {

             paraAnimation->start();

        }

        else

        {

             m_mutex.lock();

             m_bFinishAni = true;

             m_mutex.unlock();

             delete paraAnimation;

             LOG_INFO("NUCOUNT ULOCK");

            

        }

    })

}

void NumShowWidget::SlotTimeAddNum()

{

    if (m_bFinishAni)

    {

        int num = getNum();

        if (num > 0)

        {  

             m_mutex.lock();

             m_bFinishAni = false;

             m_mutex.unlock();

             setNum(num, 1000);

            

        }

    }

}

int NumShowWidget::getNum()

{

    m_addNumMutex.lock();

    if (m_vectNum.size() > 0)

    {

        int num = m_vectNum.front();

        m_vectNum.pop_front();

        m_addNumMutex.unlock();

        return num;

    }

    else

    {

        m_addNumMutex.unlock();

        return -1;

    }

   

}

void NumShowWidget::pushNum(int num)

{

    m_addNumMutex.lock();

    m_vectNum.push_back(num);

    m_addNumMutex.unlock();

}

原文地址:https://www.cnblogs.com/bclshuai/p/14104969.html

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0