QT开发(五)—— 项目实战:秒表,QTime,Qtimer的使用

标签: qt ui 控件
143人阅读 评论(0) 收藏 举报
分类:

我们继续QT之旅,这次写的依旧是个小东西,那就是秒表,这个秒表主要还是逻辑操作,实际上本身并没有多少内容,也就是学习了一下QTime和QTimer的使用,我们来看下UI是什么样子的

这里写图片描述

这里就很简单了,我们先分析一下控件,最上面是一个QLCDNumber用来显示秒数,中间四个按钮用来控制,下面就是一个记录时间点的逻辑,控件使用的是QTextBrowser,好的,我们来看下头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTime>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
    void init();

private slots:

    void updateDisplay();

    void on_btn_start_clicked();

    void on_btn_stop_clicked();

    void on_btn_pause_clicked();

    void on_btn_point_clicked();

private:
    Ui::MainWindow *ui;

    QTimer *pTimer;
    QTime baseTime;
    //显示的时间
    QString timeStr;
};

#endif // MAINWINDOW_H

可以看到,我就定义了一个公共函数init用来初始化一些数据,五个槽函数,分别是四个按钮以及一个倒计时的槽函数,又定义了一些变量,其中timeStr是显示在LCD上的最终文字,好的,我们来开始分析吧

//初始化
void MainWindow::init()
{
    //默认显示
    this->ui->lcd_play->display("00:00:00:000");

    this->pTimer = new QTimer;
    //绑定定时器的信号
    connect(this->pTimer,SIGNAL(timeout()),this,SLOT(updateDisplay()));
}

首先就是我们在初始化中先定义了需要显示的格式为00:00:00:000,因为我们只能通过代码才能这样设置,其次就是定义一个信号为timeout的定时器了

//开始
void MainWindow::on_btn_start_clicked()
{
    //获取当前时间
    this->baseTime = this->baseTime.currentTime();
    this->pTimer->start(1);

    //重置状态
    if(this->ui->btn_stop->text() != "停止")
    {
        this->ui->btn_stop->setText("停止");
    }
    if(this->ui->btn_pause->text() != "暂停")
    {
        this->ui->btn_pause->setText("暂停");
    }
}

然后我们点击开始的槽函数后,我们获取了当前的时间并且设置在baseTime上,以及重置了一下其他按钮的状态

//结束
void MainWindow::on_btn_stop_clicked()
{
    if(this->ui->btn_stop->text() == "停止")
    {
        this->ui->btn_stop->setText("清空");
        this->pTimer->stop();
    }
    else if(this->ui->btn_stop->text() == "清空")
    {
        this->ui->btn_stop->setText("停止");
        this->ui->tb_display->clear();
        this->ui->lcd_play->display("00:00:00:000");
    }

}

我们在结束的时候有两个状态,停止就直接调用timer指针的stop,清除的话就恢复下状态

//暂停
void MainWindow::on_btn_pause_clicked()
{
    static QTime pauseTime;
    if(this->ui->btn_pause->text() == "暂停")
    {
        pauseTime = QTime::currentTime();
        this->ui->btn_pause->setText("继续");
        this->pTimer->stop();
    }
    else if(this->ui->btn_pause->text() == "继续")
    {
        //进行差值计算
        QTime cut = QTime::currentTime();
        int t = pauseTime.msecsTo(cut);
        this->baseTime = this->baseTime.addMSecs(t);
        this->ui->btn_pause->setText("暂停");
        this->pTimer->start();
    }
}

我们在暂停这里,首先是定义了一个pauseTime用来获取你点击的时间,然后再调用stop,如果你再次按了继续的话,我会拿我保存的pauseTime与上一个baseTime作比较然后添加上去来弥补这个时间差,最后再调用start函数

//打点
void MainWindow::on_btn_point_clicked()
{
    //将timeStr添加到列表
    this->ui->tb_display->append(this->timeStr );
}

打点就比较简单了,直接添加上去即可

对应的槽函数里更新时间

//更新时间
void MainWindow::updateDisplay()
{
    /*
     * 1.点击开始后获取到当前的时间并且赋值给baseTime
     * 2.启动定时器,间隔1s
     * 3.槽函数中再次获取当前的时间currTime
     * 4.计算两个时间的差值t
     * 5.声明一个showTime对象给他加上t的差值
     * 6.格式化后设置显示
     */
    QTime currTime = QTime::currentTime();
    int t = this->baseTime.msecsTo(currTime);
    QTime showTime(0,0,0,0);
    showTime = showTime.addMSecs(t);
    this->timeStr = showTime.toString("hh:mm:ss:zzz");
    this->ui->lcd_play->display(timeStr);
}

也是同样的使用计算差值的方式去弥补

好的,我们来看下全部代码

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->init();
}

MainWindow::~MainWindow()
{
    delete this->pTimer;
    delete ui;
}
//初始化
void MainWindow::init()
{
    //默认显示
    this->ui->lcd_play->display("00:00:00:000");

    this->pTimer = new QTimer;
    //绑定定时器的信号
    connect(this->pTimer,SIGNAL(timeout()),this,SLOT(updateDisplay()));
}

//开始
void MainWindow::on_btn_start_clicked()
{
    //获取当前时间
    this->baseTime = this->baseTime.currentTime();
    this->pTimer->start(1);

    //重置状态
    if(this->ui->btn_stop->text() != "停止")
    {
        this->ui->btn_stop->setText("停止");
    }
    if(this->ui->btn_pause->text() != "暂停")
    {
        this->ui->btn_pause->setText("暂停");
    }
}
//结束
void MainWindow::on_btn_stop_clicked()
{
    if(this->ui->btn_stop->text() == "停止")
    {
        this->ui->btn_stop->setText("清空");
        this->pTimer->stop();
    }
    else if(this->ui->btn_stop->text() == "清空")
    {
        this->ui->btn_stop->setText("停止");
        this->ui->tb_display->clear();
        this->ui->lcd_play->display("00:00:00:000");
    }

}
//暂停
void MainWindow::on_btn_pause_clicked()
{
    static QTime pauseTime;
    if(this->ui->btn_pause->text() == "暂停")
    {
        pauseTime = QTime::currentTime();
        this->ui->btn_pause->setText("继续");
        this->pTimer->stop();
    }
    else if(this->ui->btn_pause->text() == "继续")
    {
        //进行差值计算
        QTime cut = QTime::currentTime();
        int t = pauseTime.msecsTo(cut);
        this->baseTime = this->baseTime.addMSecs(t);
        this->ui->btn_pause->setText("暂停");
        this->pTimer->start();
    }
}
//打点
void MainWindow::on_btn_point_clicked()
{
    //将timeStr添加到列表
    this->ui->tb_display->append(this->timeStr);
}
//更新时间
void MainWindow::updateDisplay()
{
    /*
     * 1.点击开始后获取到当前的时间并且赋值给baseTime
     * 2.启动定时器,间隔1s
     * 3.槽函数中再次获取当前的时间currTime
     * 4.计算两个时间的差值t
     * 5.声明一个showTime对象给他加上t的差值
     * 6.格式化后设置显示
     */
    QTime currTime = QTime::currentTime();
    int t = this->baseTime.msecsTo(currTime);
    QTime showTime(0,0,0,0);
    showTime = showTime.addMSecs(t);
    this->timeStr = showTime.toString("hh:mm:ss:zzz");
    this->ui->lcd_play->display(timeStr);
}

再来看下效果

这里写图片描述

好的,最后送上源码:点击下载

有兴趣的可以加群:690351511

查看评论

Qt学习笔记:QTimer和QTime

QTimer ClassQTimer是一个计时器类 它的使用分三步,创建对象,连接signal和slot函数,start() QTimer *timer = new QTimer(this);...
  • founderznd
  • founderznd
  • 2016-05-18 11:30:13
  • 6224

QTimer定时器以及QTime获取时间

实例: { QTimer *myTimer; myTimer=new QTimer(this); myTimer->start(1000); connect(myTimer...
  • liukang325
  • liukang325
  • 2013-12-08 13:56:58
  • 3915

QTimer,QTime的一点应用

  • xiaoyangger
  • xiaoyangger
  • 2010-01-28 21:19:00
  • 3083

秒表功能实现

秒表要实现的功能描述:下方灰色背景的view上有两个按钮-开始/停止按钮 和 计次按钮。点击开始按钮,中间的大时钟开始计时,这时点击计次按钮,右上角的小时钟会把此刻的瞬时时间记录下来,同时在下面的t...
  • qq_27364431
  • qq_27364431
  • 2015-06-06 14:08:10
  • 705

QT中QTimer的使用方法介绍

原理QT中定时器的工作原理:定义一个定时器,将这个定时器的timeout()信号和自己定义的函数进行绑定,如同在程序的主线程里面每隔一段时间执行一次自己定义的槽函数。实现QTimer* my_time...
  • u010104710
  • u010104710
  • 2015-09-22 18:45:04
  • 527

QTime获取当前时间,QDateTime获取日期和时间,QTimer定时器,QLCDNumber数码显示框

使用toString 获取指定的时间格式,qtime使用的是24小时的时钟格式,     设置,启动定时器 QTimer *timer=new QTimer(this);     conne...
  • du_bingbing
  • du_bingbing
  • 2015-11-10 18:00:07
  • 1874

PyQt5定时器QTimer的简单操作

当代程序中需要显示时间时或者需要在程序中周期性地进行某项操作,就会用到定时器。PyQt5就提供了一个定时器QTimer来实现这种操作 1.导入QTimer模块 from PyQt5.QtCore ...
  • qq_29666899
  • qq_29666899
  • 2018-01-21 10:14:55
  • 296

我的第一个android小项目——秒表计时器之感受

大四进入实习阶段,在学校那叫个什么都不会,很少写代码,这样的我去实习简直是痛苦至极。进如公司的第一个月,老大让我写一个计算器,一边看老罗的视频一边写代码,对一个没什么代码经验的我来说那叫个痛苦,写了一...
  • lcugym
  • lcugym
  • 2013-11-21 18:04:08
  • 1547

Qt多线程中调用QTimer

单独使用QThread多线程和QTimer定时器很简单,今天要利用子线程读取视频并显示,在QThread的派生类中使用QTimer,在触发QTimer的timeout()信号之后总是无法触发其槽函数,...
  • hanshuobest
  • hanshuobest
  • 2016-05-25 00:21:09
  • 3442

Qt之QTimer

简述QTimer类提供了重复和单次触发信号的定时器。QTimer类为定时器提供了一个高级别的编程接口。很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用start...
  • u011012932
  • u011012932
  • 2016-06-30 14:16:21
  • 20710
    个人资料
    专栏达人 持之以恒 博客之星
    等级:
    访问量: 117万+
    积分: 1万+
    排名: 1034
    博客专栏
    文章分类