Qt学习之秒表的实现(StopWatch) (转)
秒表对于我来说并不陌生,在之前自己学习单片机时,实现过秒表和数字钟;基本思路:开启单片机带的定时器,并设置它没10ms溢出一次,分别用三个变量hour,minute,secong记录秒表的时分秒,然后每0.5s刷新一次显示函数,这样最基本的秒表的基本功能就实现了;当然,在Qt里面设计一个秒表也可以用相似的方法就行实现。
由于嵌入式实验要用Qt做个俄罗斯方块游戏,想在游戏中加个模块(游戏的时间);因此才有了设计秒表的想法。在此,想把秒表封装成类模块,提供三个接口:启动秒表,暂停秒表,复位秒表。
1.秒表的界面设计
用QtCreator新建一个QtGUI应用程序,工程名为myStopWatch,类名为MyStopWatch,基类为QWidget。双击mystopwatch.ui文件,进入界面设计的画面,添加三个lineEdit控件,调整大小,并分别命名为lineEditH,lineEditM,textEditS,在font选项下,可以改变字体的大小,完成后的结果如下图:
2.秒表的类实现
新建好的工程里面有四个文件:mystopwatch.h,mystopwatch.cpp,main.cpp,mystopwatch.ui
(1)mystopwatch.h
在public下面添加三个接口函数:
void StartStopwatch();
void ResetStopwatch();
void StopStopwatch();
在private下添加如下代码:
int hourTemp; //Hour int minuteTemp; //Minute int secondTemp; //Second int countTemp; QTimer *msTimer; void Display(QString,QString,QString); void SetStrLength(QString *str, int length);
并设计一个时间槽timeSlot(),每当定时器溢出时,就会执行槽中的代码;
完成后mystopwatch.h文件中的内容如下:
- #ifndef MYSTOPWATCH_H
- #define MYSTOPWATCH_H
- #include <QWidget>
- #include<QTimer>
- namespace Ui {
- class MyStopWatch;
- }
- class MyStopWatch : public QWidget
- {
- Q_OBJECT
- public:
- explicit MyStopWatch(QWidget *parent = 0);
- ~MyStopWatch();
- void StartStopwatch(); //启动秒表
- void ResetStopwatch(); //复位秒表
- void StopStopwatch(); //暂停秒表
- private:
- Ui::MyStopWatch *ui;
- int hourTemp; //Hour
- int minuteTemp; //Minute
- int secondTemp; //Second
- int countTemp;
- QTimer *msTimer; //定义一个定时器
- void Display(QString,QString,QString);
- void SetStrLength(QString *str, int length);
- private slots:
- void TimeSlot();
- };
- #endif // MYSTOPWATCH_H

#ifndef MYSTOPWATCH_H
#define MYSTOPWATCH_H #include <QWidget>
#include<QTimer>
namespace Ui {
class MyStopWatch;
} class MyStopWatch : public QWidget
{
Q_OBJECT public:
explicit MyStopWatch(QWidget *parent = 0);
~MyStopWatch(); void StartStopwatch(); //启动秒表
void ResetStopwatch(); //复位秒表
void StopStopwatch(); //暂停秒表 private:
Ui::MyStopWatch *ui; int hourTemp; //Hour
int minuteTemp; //Minute
int secondTemp; //Second
int countTemp; QTimer *msTimer; //定义一个定时器
void Display(QString,QString,QString);
void SetStrLength(QString *str, int length);
private slots:
void TimeSlot();
}; #endif // MYSTOPWATCH_H
(2)mystopwatch.cpp
在类MyStopWatch的构造函数中,对秒表的显示进行初始化,创建一个定时器并把相应的信号与槽进行连接;即在构造函数中添加如下代码:
- MyStopWatch::MyStopWatch(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::MyStopWatch)
- {
- ui->setupUi(this);
- countTemp=0;
- secondTemp=0;
- minuteTemp=0;
- hourTemp=0;
- msTimer= new QTimer(this); //this说明是当前类对象的定时器
- //把信号与槽进行连接
- connect(msTimer,SIGNAL(timeout()),this,SLOT(TimeSlot()));
- }

MyStopWatch::MyStopWatch(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyStopWatch)
{
ui->setupUi(this);
countTemp=0;
secondTemp=0;
minuteTemp=0;
hourTemp=0;
msTimer= new QTimer(this); //this说明是当前类对象的定时器
//把信号与槽进行连接
connect(msTimer,SIGNAL(timeout()),this,SLOT(TimeSlot()));
}
槽TimeSlot()的实现:
- void MyStopWatch::TimeSlot()
- {
- countTemp+=1;
- if(countTemp==100)
- {
- countTemp=0;
- secondTemp+=1;
- if(secondTemp==60)
- {
- secondTemp=0;
- minuteTemp+=1;
- if(minuteTemp==60)
- {
- minuteTemp=0;
- hourTemp+=1;
- if(hourTemp==24)
- {
- hourTemp=0;
- }
- }
- }
- }
- //把整数转换成字符串
- QString hourstr = QString::number(hourTemp);
- QString minutestr = QString::number(minuteTemp);
- QString secondstr = QString::number(secondTemp);
- Display(hourstr,minutestr,secondstr);
- }
- void MyStopWatch::Display(QString hour, QString minute, QString second)
- {
- ui->lineEditH->setText(hour);
- ui->lineEditM->setText(minute);
- ui->lineEditS->setText(second);
- }

void MyStopWatch::TimeSlot()
{
countTemp+=1;
if(countTemp==100)
{
countTemp=0;
secondTemp+=1;
if(secondTemp==60)
{
secondTemp=0;
minuteTemp+=1;
if(minuteTemp==60)
{
minuteTemp=0;
hourTemp+=1;
if(hourTemp==24)
{
hourTemp=0;
}
}
}
}
//把整数转换成字符串
QString hourstr = QString::number(hourTemp);
QString minutestr = QString::number(minuteTemp);
QString secondstr = QString::number(secondTemp);
Display(hourstr,minutestr,secondstr);
} void MyStopWatch::Display(QString hour, QString minute, QString second)
{
ui->lineEditH->setText(hour);
ui->lineEditM->setText(minute);
ui->lineEditS->setText(second);
}
启动秒表的代码实现:
- void MyStopWatch::StartStopwatch()
- {
- msTimer->start(10); //10ms
- }

void MyStopWatch::StartStopwatch()
{
msTimer->start(10); //10ms
}
此时在main添加一行代码,调用StartStopwatch()来开启秒表,代码如下:
- #include <QtGui/QApplication>
- #include "mystopwatch.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MyStopWatch w;
- w.StartStopwatch();
- w.show();
- return a.exec();
- }

#include <QtGui/QApplication>
#include "mystopwatch.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyStopWatch w;
w.StartStopwatch();
w.show(); return a.exec();
}
此时,运行程序,我们的秒表就可以跑起来了;其效果图如下,
由图可知我们的秒表的界面有点难看,下面我们对界面进行优化,字体颜色和背景颜色,保证时,分,秒的数字是一位时,对十位进行补零,把十位也显示出来。
3.秒表的界面优化
(1)linetext控件的背景颜色和控件中的字体颜色
在QWidget类对象的属性中,有个palette,点击改变调色板,界面如下:
其中Text可以改变字体的颜色,这里设置为红色;Base是改变控件背景颜色,设置为蓝色。
QPalete::Window,通常指窗口部件的背景色;
QPalette:WindowText,通常指窗口部件的前景色;
QPalette::Base,指文本输入窗口部件(比如QtextEdit,QLinedit等)的背景色.
QPalette::Text,与QPalette::Base一块使用,指文本输入窗口部件的前景色;
QPalette::Button,指按钮窗口部件的背景色;
QPalette::ButtonText,指按钮窗口部件的前景色.
(2)SetStrLength()函数的实现
- void MyStopWatch::SetStrLength(QString *str, int length)
- {
- if(str->length()<length)
- {
- str->insert(0,"0");
- }
- }

void MyStopWatch::SetStrLength(QString *str, int length)
{
if(str->length()<length)
{
str->insert(0,"0");
}
}
在槽TimeSlot()中,在调用Display()函数前,添加如下代码:
- //把整数转换成字符串
- QString hourstr = QString::number(hourTemp);
- QString minutestr = QString::number(minuteTemp);
- QString secondstr = QString::number(secondTemp);
- //设置字符串的长度为2
- SetStrLength(&hourstr,2);
- SetStrLength(&minutestr,2);
- SetStrLength(&secondstr,2);
- Display(hourstr,minutestr,secondstr);

//把整数转换成字符串
QString hourstr = QString::number(hourTemp);
QString minutestr = QString::number(minuteTemp);
QString secondstr = QString::number(secondTemp);
//设置字符串的长度为2
SetStrLength(&hourstr,2);
SetStrLength(&minutestr,2);
SetStrLength(&secondstr,2);
Display(hourstr,minutestr,secondstr);
再次,运行程序,结果如下:
其他接口函数的实现:
- void MyStopWatch::ResetStopwatch()
- {
- ui->lineEditH->setText("00");
- ui->lineEditM->setText("00");
- ui->lineEditS->setText("00");
- countTemp=0;
- secondTemp=0;
- minuteTemp=0;
- hourTemp=0;
- }
- void MyStopWatch::StopStopwatch()
- {
- msTimer->stop();
- }

void MyStopWatch::ResetStopwatch()
{
ui->lineEditH->setText("00");
ui->lineEditM->setText("00");
ui->lineEditS->setText("00");
countTemp=0;
secondTemp=0;
minuteTemp=0;
hourTemp=0; } void MyStopWatch::StopStopwatch()
{
msTimer->stop();
}
http://blog.csdn.net/lpp0900320123/article/details/26164857
Qt学习之秒表的实现(StopWatch) (转)的更多相关文章
- QT学习第1天
QT学习第一天 坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...
- 【转载】分享一些Qt学习资源,欢迎下载
资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...
- QT学习之路--创建一个对话框
Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- Qt 学习资料
Qter开源社区http://www.qter.org/ [Qt教程], 作者yafeilinux [视频] QT学习之路:从入门到精通 <C++ Qt 编程视频教程>
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...
- Qt学习博客推荐
附录C Qt资源 C.1 Qt 官方资源 全 球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件. ...
- qt学习教程1.qt开发环境搭建
qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...
- QT学习教程
原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...
随机推荐
- 【Python】日期模块总结
Time Tuple: 索引 字段 值 0 年(四位数字) 2015 1 月份 1 - 12 2 日期 1 - 31 3 小时 0 - 23 4 分钟 0 - 59 5 秒 0 - 61 (60 或 ...
- Factorialize a Number
计算一个整数的阶乘 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120 当你完成不了挑战的时候 ...
- GPON介绍及华为OLT网关注册配置流程(转)
原文地址:https://blog.csdn.net/zhouzxi/article/details/79244862 一.GPON介绍 1.GPON简介 随着技术的发展,光纤变得“便宜又好用”,因此 ...
- js停止(阻止)浏览器继续加载内容
这个应该是一个比较特殊的要求,一般网站都没有这个功能,对于一个新手来说,真的不知道从何处下手,只有在网上搜索了,寻找现成答案,寻寻觅觅一天没有结果.但是这个功能还是需要,第二天继续网上大肆搜寻.终于功 ...
- 消除浏览器对input输入框的自动填充
Mozilla官方文档建议的是 直接使用 autocomplete = ‘off’ 即可禁止输入框从浏览器cache获取数据,博主以前使用这个也就足够兼容浏览器了. 现在发现,却在chrome.fir ...
- PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
本文实例讲述了PHP获取日期对应星期.一周日期.星期开始与结束日期的方法.分享给大家供大家参考,具体如下: /* * 获取日期对应的星期 * 参数$date为输入的日期数据,格式如:2018-6-22 ...
- Python3基本数据类型(五)
Python中的变量不需要声明,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在Python中变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型 ...
- 201621123005《Java程序设计》第二周学习总结
201621123005<JAVA程序设计>第二周学习总结 1. 本周学习总结 本章学习了String 的不可变性.自动装箱和拆箱过程,并熟悉了动态数组等 Java中的应用,还有Array ...
- Linux0.11信号处理详解
之前在看操作系统信号这一章的时候,一直是云里雾里的,不知道信号到底是个啥玩意儿..比如在看<Unix环境高级编程>时,就感觉信号是个挺神奇的东西.比如看到下面这段代码: #include& ...
- Python面向对象的三大特征 --- 封装、继承、多态
一.封装 1)封装:是面向对象的一大特点:将属性和方法封装在一个抽象类中.外界使用类创建对象,然后让对象调用内部方法.对象方法的细节都被封装在类的内部. class Person(): def _ ...