Qt 实现定时器显示界面LcdNumber倒计时

解决的问题:

Axure的草图

Qt 实现定时器显示界面LcdNumber倒计时_第1张图片

实现这么个界面,那么我们需要怎么做呢,Qt设计师拿出来,拖拖拖

我们暂且叫它:显示定时器功能的可视化界面

 


如何实现:

Qt 实现定时器显示界面LcdNumber倒计时_第2张图片

这不用多说了吧,就这几个控件,简单的跟个一 一样


 

代码块解析:

.ui文件



 DisplayTimerWidget
 
  
   
    0
    0
    283
    110
   
  
  
   DisplayTimerWidget
  
  
   
    
     
      回波参数设置
     
     
      
       
        
         时长:
        
       
      
      
       
      
      
       
        
         开始
        
       
      
      
       
        
         倒计时:
        
       
      
      
       
      
      
       
        
         停止
        
       
      
     
    
   
  
 
 
 
 

.h文件

/*********************************************************************************
*Author:zhouFuLiang
*Date: 2023-05-09  11:11
*Description: 显示定时器功能的可视化界面
**********************************************************************************/
#ifndef DISPLAYTIMERWIDGET_H
#define DISPLAYTIMERWIDGET_H

#include 
#include 

namespace Ui {
class DisplayTimerWidget;
}

class DisplayTimerWidget : public QWidget
{
    Q_OBJECT

public:
    explicit DisplayTimerWidget(const QString &strTitle, QWidget *parent = 0);
    ~DisplayTimerWidget();


signals:
    void writeEchoRegister();
    void stopWriteEchoRegister();

public slots:
    /*
     * @brief 开始按钮的槽函数
     * @param
     * @param
     * @return
    */
    void startBtnSlot();
    /*
     * @brief 自定义定时器槽函数
     * @param
     * @param
     * @return
    */
    void updateDefiTimer();
    /*
     * @brief 秒数定时器 用于更新显示倒计时
     * @param
     * @param
     * @return
    */
    void updateTimer();
    /*
     * @brief 停止按钮槽函数
     * @param
     * @param
     * @return
    */
    void stopBtnSlot();
private:
    void init();
    void initConnect();
    /*
     * @brief 时间转换秒数
     * @param str:时间样式的string
     * @param
     * @return 秒
    */
    int timeStringConverInt(const QString &str);
    /*
     * @brief 秒数转成时间
     * @param nValue 秒数
     * @param
     * @return 时间类型的String 00:00:00
    */
    QString timeIntCoverString(const int &nValue);
private:
    Ui::DisplayTimerWidget *ui;
    QTimer *m_pDefiTimer;
    QTimer *m_pTimer;
    int m_currSetValue;
    QString m_strTitle;
};

#endif // DISPLAYTIMERWIDGET_H

.cpp文件

#include "displaytimerwidget.h"
#include "ui_displaytimerwidget.h"
#include 
#include 

DisplayTimerWidget::DisplayTimerWidget(const QString &strTitle, QWidget *parent) :
    QWidget(parent),
    m_currSetValue(0),
    m_strTitle(strTitle),
    ui(new Ui::DisplayTimerWidget)
{
    ui->setupUi(this);
    init();
    initConnect();
}

DisplayTimerWidget::~DisplayTimerWidget()
{
    delete ui;
}

void DisplayTimerWidget::init()
{
    ui->groupBox->setTitle(m_strTitle);
    ui->lineEdit->setInputMask("00:00:00");
    ui->lineEdit->setCursorPosition(0);
    ui->lcdNumber->setDigitCount(8);
    ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat);

    m_pDefiTimer = new QTimer();
    m_pDefiTimer->setInterval(100);
    m_pTimer = new QTimer();
    m_pTimer->setInterval(1000);
}

void DisplayTimerWidget::initConnect()
{
    connect(ui->startBt, &QPushButton::clicked, this, &DisplayTimerWidget::startBtnSlot);
    connect(m_pDefiTimer, &QTimer::timeout, this, &DisplayTimerWidget::updateDefiTimer);
    connect(m_pTimer, &QTimer::timeout, this, &DisplayTimerWidget::updateTimer);
    connect(ui->stopBt, &QPushButton::clicked, this, &DisplayTimerWidget::stopBtnSlot);
}

void DisplayTimerWidget::startBtnSlot()
{
    if(m_pDefiTimer->isActive()){
        m_pDefiTimer->stop();
    }
    m_currSetValue = timeStringConverInt(ui->lineEdit->text());
    ui->lcdNumber->display(timeIntCoverString(m_currSetValue));
    if(m_currSetValue == 0)
        return;
    m_pDefiTimer->start();
    m_pTimer->start();
}

void DisplayTimerWidget::updateDefiTimer()
{
    emit writeEchoRegister();
}

void DisplayTimerWidget::updateTimer()
{
    --m_currSetValue;
    //qDebug() << "current value: " << m_currSetValue;
    QString strTime = timeIntCoverString(m_currSetValue);
    ui->lcdNumber->display(strTime);

    if(0 == m_currSetValue){
        if(m_pTimer->isActive()){
            m_pTimer->stop();
        }
        if(m_pDefiTimer->isActive()){
            m_pDefiTimer->stop();
        }
        emit stopWriteEchoRegister();
    }
}

void DisplayTimerWidget::stopBtnSlot()
{
    m_pDefiTimer->stop();
    m_pTimer->stop();
    ui->lcdNumber->display("0");
    emit stopWriteEchoRegister();
}

int DisplayTimerWidget::timeStringConverInt(const QString &str)
{
    int nTime = 0;
    if(str.isEmpty())
        return nTime;
    QStringList strList;
    strList = str.split(":");
    if(strList.size() == 3){
        nTime = strList.at(0).toInt()*3600+strList.at(1).toInt()*60+strList.at(2).toInt();
    }
    return nTime;
}

QString DisplayTimerWidget::timeIntCoverString(const int &nValue)
{
    // 传秒数ss=1,传毫秒数ss=1000
    qint64 ss = 1;
    qint64 mi = ss * 60;
    qint64 hh = mi * 60;
    qint64 dd = hh * 24;

    qint64 day = nValue / dd;
    qint64 hour = (nValue - day * dd) / hh;
    qint64 minute = (nValue - day * dd - hour * hh) / mi;
    qint64 second = (nValue - day * dd - hour * hh - minute * mi) / ss;

    QString hou = QString::number(hour, 10);
    QString min = QString::number(minute, 10);
    QString sec = QString::number(second, 10);

    hou = hou.length() == 1 ? QString("0%1").arg(hou) : hou;
    min = min.length() == 1 ? QString("0%1").arg(min) : min;
    sec = sec.length() == 1 ? QString("0%1").arg(sec) : sec;
    return hou + ":" + min + ":" + sec;
}

你可能感兴趣的:(Qt,Function,qt,ui,开发语言)