我们继续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_OBJECTpublic: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开发(五)—— 项目实战:秒表,QTime,Qtimer的使用相关推荐

  1. Android零基础开发到项目实战

    Android零基础开发到项目实战(目录) 前言:本教程适合零基础学习安卓开发的伙伴,下面是目录,本博主会每天定时更新每一章节的教程,未完..... 一.Java基础阶段 day01_Java语言概述 ...

  2. python爬虫项目实例-Python爬虫开发与项目实战

    Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...

  3. python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...

    Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...

  4. 《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第3章,第3.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 初识网 ...

  5. 《Python爬虫开发与项目实战》——1.6 小结

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第1章,第1.6节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.6 小结 ...

  6. 《Python爬虫开发与项目实战》——第1章 回顾Python编程 1.1 安装Python

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第1章,第1.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第1章 回顾P ...

  7. Python编程:从入门到实践+爬虫开发与项目实战+网络编程基础+项目开发实战

    给还在苦苦自学Python的小伙伴们分享一波学习教程~有了它们,至少能节省50%的时间,少走一半的弯路. 书不在多,而在于精~ <Python编程:从入门到实践>豆瓣评分9.2 本书是针对 ...

  8. 【创科之龙】零基础学习嵌入式开发以及项目实战开发【第二期视频】

    [创科之龙]零基础学习嵌入式开发以及项目实战开发[学习交流零基础火热进行ing] 大家好,我是aiku,上期的项目学习资料在电子发烧友论坛上分享,大家觉得都很好. 在这里我首先要感谢电子发烧友给我们的 ...

  9. Java高级开发0-1项目实战-青鸟商城-Day03

    作者:田超凡 原创博文,严禁复制转载,仿冒必究 项目计划 第三天: 前台系统搭建 商城首页展示 Cms系统的实现 内容分类管理 内容管理 前台内容动态展示 1. 商城首页展示 系统架构: 页面位置: ...

  10. 【源码及课件分享】Java实战项目之酒店客房管理系统_Java项目开发_Java项目实战

    Java实战项目又双叒叕来咯~小伙伴们请查收~酒店客房管理系统![源码及课件分享]Java实战项目之酒店客房管理系统_Java项目开发_Java项目实战_Java毕业设计https://www.bil ...

最新文章

  1. 重磅!腾讯发布AI生态计划将赋能1000合作伙伴!
  2. 《数据挖掘导论》实验课——实验一、数据处理之Numpy
  3. LogStash 中字段的排除和数据的排除
  4. 论文笔记-Augmented Lagrange Multiplier Method for Recovery of Low-Rank Matrices
  5. 电商系统的售后模块设计
  6. java api项目配置统一的错误返回json提示
  7. 【电信增值业务学习笔记】3 语音类增值业务
  8. hawq state 报错: the database is down, but Ambari shows all hawq services as being
  9. CentOS系统Tomcat 8.5/9部署SSL证书
  10. TFS报表管理器无权限访问的配置
  11. @babel/polyfill按需加载
  12. zk选举机制和分布式一致性原理
  13. 初识EMC元器件(四)——共模电感选型及应用
  14. 计算机组成原理 启航教育,2021计算机考研:计算机组成原理知识点CPU的功能和基本结构...
  15. Comparator--比较器
  16. Testlink使用文档
  17. Ubuntu安装re2c和ninja
  18. 计算机辅助设计与制造考试题,计算机辅助设计与制造试题.docx
  19. Python爬虫随笔:爬取iciba上的单词发音文件
  20. JS三种等号的区别(=、==、===)

热门文章

  1. Azure Kinect DK 点云和RGBD图的获取
  2. 寒假刷刷算法题(3)
  3. 软件架构师的一点生活启示
  4. 焦虑与工作记忆容量的研究之路
  5. 六、inetcpl.cpl解决网页打不开
  6. 内存、堆栈和各种变量的理解
  7. java正则表达式匹配小括号内的内容
  8. Java的Pattern与Match类
  9. 城市改造 (city)
  10. 目标跟踪算法分析(一)