QT提供了一个有趣的控件,模仿LCD的东东,虽然暂时没有什么应用中需要用到它,不过感觉这个控件模拟显示LCD效果应该不错,于是决定做一个倒计时的小程序(包含暂停、重置、设置时间等功能)。如果你也想要一款一样的,那就跟着我来吧!
先上效果图:
在这里插入图片描述
在这里插入图片描述
是不是你想要的呢??看正文!

一、关键对象和函数的说明
1、管家对象为timer
第一,这个对象我们必须首先包含它的库文件,不要忘记。第二,它的start函数的参数控制timer多久后启动。
void start(int msec);
2、信号发生与连接
准备好timer对象后,我们可以让timer发出timeout信号,让信号槽里我们自定义的timeoutRun函数执行起来,如下:
connect(timer, SIGNAL(timeout()), this, SLOT(timeoutRun()));
我们也可以这样调用
connect(timer,&QTimer::timeout,this,&MainWindow::timeoutRun);

二、业务逻辑
具体秒钟分钟和时钟的进位就不啰嗦了,太简单。这里说一说暂停和重置。
1、暂停
暂停必须保存好暂停瞬间的时分秒的数值,重启的时候就从这个数值开始,所以我们设置了一个暂停标志pausef。
2、重置
重置要将时分秒设置为目标时间的数值,但我们按下重置键后前面启动的倒计时还会再跑一轮,导致时分秒别设置为最后一轮的数值,所以我们设置一个重置标志resetf来控制程序不保存重置后的最后一轮数值。

三、代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lcdNumber->setDigitCount(8);
    ui->lcdNumber->display(QDate::currentDate().toString("yyyy-MM-dd"));

    ui->lcdNumber->setSegmentStyle(QLCDNumber::Filled);


        timer = new QTimer(this);
        connect(timer,&QTimer::timeout,this,&MainWindow::timeoutRun);
        on_btnReset_clicked();

}

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


void MainWindow::timeoutRun()
{
    if(pausef){

        //定时12个小时
        for(hour = mhour;hour>=0;hour--)
             for( min =mmin;min>=0 ;min--)
                 for(sec=msec;sec>=0;sec--)
                    {

                        ui->lcdNumber->display(QDateTime::currentDateTime().toString(
                                       QString("%1").arg(hour, 2, 10, QChar('0'))+":"+
                                       QString("%1").arg(min, 2, 10, QChar('0'))+":"+
                                       QString("%1").arg(sec, 2, 10, QChar('0'))));
                        Delay_MSec(1000);

                        if(min>0 && sec==0)
                            msec=59;
                        if(hour>0 && min==0)
                            mmin=59;

                        if(!pausef )
                        {
                            if(!resetf) //被重置后不记录当前时间位置
                            {
                                mhour=hour;
                                mmin=min;
                                msec=sec;
                            }
                            return;
                        }
                     }
         timer->stop();
         //这里可以调用一个你自定义的函数标志着倒计时结束。
    }


}

void MainWindow::Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec);
    while(QTime::currentTime() < _Timer ){
        QCoreApplication::processEvents(QEventLoop::AllEvents,100);

    }

}

void MainWindow::on_pushButton_clicked()
{
    resetf=0;

    pausef=!pausef;
    if(pausef)
    {
     timer->start(10);
     ui->pushButton->setText("暂停[&P]");
    }
    else
    {
         ui->pushButton->setText("开始[&S]");
         timer->stop();
    }
}

void MainWindow::on_btnReset_clicked()
{
    pausef=0;
    resetf=1; //重置标志
    timer->stop();

    ui->pushButton->setText("开始[&S]");
    ui->lcdNumber->display(QDateTime::currentDateTime().toString("00:00:00"));
    mhour=ui->timeEdit->time().hour();
    msec=ui->timeEdit->time().second();
    mmin=ui->timeEdit->time().minute();

}

源代码连接
这个倒计时器稍加修改可以应用于多种场合,希望对初学者理解LCDNumber的应用有所帮助。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐