秒表对于我来说并不陌生,在之前自己学习单片机时,实现过秒表和数字钟;基本思路:开启单片机带的定时器,并设置它没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文件中的内容如下:

  1. #ifndef MYSTOPWATCH_H
  2. #define MYSTOPWATCH_H
  3. #include <QWidget>
  4. #include<QTimer>
  5. namespace Ui {
  6. class MyStopWatch;
  7. }
  8. class MyStopWatch : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit MyStopWatch(QWidget *parent = 0);
  13. ~MyStopWatch();
  14. void StartStopwatch();  //启动秒表
  15. void ResetStopwatch();  //复位秒表
  16. void StopStopwatch();   //暂停秒表
  17. private:
  18. Ui::MyStopWatch *ui;
  19. int hourTemp;           //Hour
  20. int minuteTemp;         //Minute
  21. int secondTemp;         //Second
  22. int countTemp;
  23. QTimer *msTimer;   //定义一个定时器
  24. void Display(QString,QString,QString);
  25. void SetStrLength(QString *str, int length);
  26. private slots:
  27. void TimeSlot();
  28. };
  29. #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的构造函数中,对秒表的显示进行初始化,创建一个定时器并把相应的信号与槽进行连接;即在构造函数中添加如下代码:

  1. MyStopWatch::MyStopWatch(QWidget *parent) :
  2. QWidget(parent),
  3. ui(new Ui::MyStopWatch)
  4. {
  5. ui->setupUi(this);
  6. countTemp=0;
  7. secondTemp=0;
  8. minuteTemp=0;
  9. hourTemp=0;
  10. msTimer= new QTimer(this);  //this说明是当前类对象的定时器
  11. //把信号与槽进行连接
  12. connect(msTimer,SIGNAL(timeout()),this,SLOT(TimeSlot()));
  13. }
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()的实现:

  1. void MyStopWatch::TimeSlot()
  2. {
  3. countTemp+=1;
  4. if(countTemp==100)
  5. {
  6. countTemp=0;
  7. secondTemp+=1;
  8. if(secondTemp==60)
  9. {
  10. secondTemp=0;
  11. minuteTemp+=1;
  12. if(minuteTemp==60)
  13. {
  14. minuteTemp=0;
  15. hourTemp+=1;
  16. if(hourTemp==24)
  17. {
  18. hourTemp=0;
  19. }
  20. }
  21. }
  22. }
  23. //把整数转换成字符串
  24. QString hourstr = QString::number(hourTemp);
  25. QString minutestr = QString::number(minuteTemp);
  26. QString secondstr = QString::number(secondTemp);
  27. Display(hourstr,minutestr,secondstr);
  28. }
  29. void MyStopWatch::Display(QString hour, QString minute, QString second)
  30. {
  31. ui->lineEditH->setText(hour);
  32. ui->lineEditM->setText(minute);
  33. ui->lineEditS->setText(second);
  34. }
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);
}

启动秒表的代码实现:

  1. void MyStopWatch::StartStopwatch()
  2. {
  3. msTimer->start(10); //10ms
  4. }
void MyStopWatch::StartStopwatch()
{
msTimer->start(10); //10ms
}

此时在main添加一行代码,调用StartStopwatch()来开启秒表,代码如下:

  1. #include <QtGui/QApplication>
  2. #include "mystopwatch.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MyStopWatch w;
  7. w.StartStopwatch();
  8. w.show();
  9. return a.exec();
  10. }
#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()函数的实现

  1. void MyStopWatch::SetStrLength(QString *str, int length)
  2. {
  3. if(str->length()<length)
  4. {
  5. str->insert(0,"0");
  6. }
  7. }
void MyStopWatch::SetStrLength(QString *str, int length)
{
if(str->length()<length)
{
str->insert(0,"0");
}
}

在槽TimeSlot()中,在调用Display()函数前,添加如下代码:

  1. //把整数转换成字符串
  2. QString hourstr = QString::number(hourTemp);
  3. QString minutestr = QString::number(minuteTemp);
  4. QString secondstr = QString::number(secondTemp);
  5. //设置字符串的长度为2
  6. SetStrLength(&hourstr,2);
  7. SetStrLength(&minutestr,2);
  8. SetStrLength(&secondstr,2);
  9. 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);

再次,运行程序,结果如下:

其他接口函数的实现:

  1. void MyStopWatch::ResetStopwatch()
  2. {
  3. ui->lineEditH->setText("00");
  4. ui->lineEditM->setText("00");
  5. ui->lineEditS->setText("00");
  6. countTemp=0;
  7. secondTemp=0;
  8. minuteTemp=0;
  9. hourTemp=0;
  10. }
  11. void MyStopWatch::StopStopwatch()
  12. {
  13. msTimer->stop();
  14. }
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) (转)的更多相关文章

  1. QT学习第1天

    QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...

  2. 【转载】分享一些Qt学习资源,欢迎下载

    资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...

  3. QT学习之路--创建一个对话框

    Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...

  4. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  5. Qt 学习资料

    Qter开源社区http://www.qter.org/ [Qt教程], 作者yafeilinux [视频] QT学习之路:从入门到精通 <C++ Qt 编程视频教程>

  6. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  7. Qt学习博客推荐

    附录C Qt资源 C.1 Qt 官方资源 全 球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件. ...

  8. qt学习教程1.qt开发环境搭建

    qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...

  9. QT学习教程

    原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...

随机推荐

  1. HDU 4352 XHXJ's LIS ★(数位DP)

    题意 求区间[L,R]内满足各位数构成的数列的最长上升子序列长度为K的数的个数. 思路 一开始的思路是枚举数位,最后判断LIS长度.但是这样的话需要全局数组存枚举的各位数字,同时dp数组的区间唯一性也 ...

  2. 无密码登陆的ssh和ssh-agent

    原文地址:http://lxshopping.blog.51cto.com/4542643/1179864/ 一,不需要输密码的ssh 原理:首先服务器端把公钥传给Client端,Client端在验证 ...

  3. 关于Mac上使用ideviceinstaller操作iPhoneXR等24位UDID设备报“ERROR: Invalid UDID specified”解决办法

    最近新申请了一台iPhone XR, 测试时发现使用ideviceinstaller命令老是报错: Jackeys-MacBook-Pro:~ jackey$ ideviceinstaller -u ...

  4. 使用minidom来处理XML的示例

    http://www.cnblogs.com/xuxm2007/archive/2011/01/16/1936610.html http://blog.csdn.net/ywchen2000/arch ...

  5. uname命令行

    常用命令uname -v # uname -i #uname -a dream361@master:~$ uname -n #主机名称 master dream361@master:~$ uname ...

  6. mac下webstorm添加scss watcher

    一.前提条件: 1.安装ruby,如果我没记错的话,mac自带ruby,终端输入 ruby -v ,回车,如果显示ruby的版本号,则说明ruby环境已经安装好了.如果没有,自行安装ruby.例如我的 ...

  7. 利用国内镜像下载Android源码,并编译生成image镜像文件

    为了编译安卓源码,首先需要一个Linux,本次采用Ubuntu Kylin14.04,内核版本3.13.装在四核.4G内存.1T硬盘的虚拟机上查看内核版本号:$uname -all清华镜像地址清华镜像 ...

  8. 剑指offer--40.翻转单词顺序列

    时间限制:1秒 空间限制:32768K 热度指数:276854 本题知识点: 字符串 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写 ...

  9. CUDA Samples: Julia

    以下CUDA sample是分别用C++和CUDA实现的绘制Julia集曲线,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第四章,各个文件内 ...

  10. 如何查看PHP的配置信息

    1.问题描述 如何利用PHP函数查看PHP的配置信息 2.问题函数 <?php echo phpinfo(); ?> 3.输出结果 phpinfo() PHP Version => ...