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文件中的内容如下:

[cpp] view plain copy print?

  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的构造函数中,对秒表的显示进行初始化,创建一个定时器并把相应的信号与槽进行连接;即在构造函数中添加如下代码:

[cpp] view plain copy print?

  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()的实现:

[cpp] view plain copy print?

  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);
}

启动秒表的代码实现:

[cpp] view plain copy print?

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

void MyStopWatch::StartStopwatch()
{
    msTimer->start(10); //10ms
}

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

[cpp] view plain copy print?

  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()函数的实现

[cpp] view plain copy print?

  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()函数前,添加如下代码:

[cpp] view plain copy print?

  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);

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

其他接口函数的实现:

[cpp] view plain copy print?

  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

时间: 2024-10-07 03:20:21

Qt学习之秒表的实现(StopWatch) (转)的相关文章

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

QT学习之路(1):彩票绝对不中模拟器

//============================================//绝对不中,彩票开奖模拟器#include "mainwindow.h"#include "ui_mainwindow.h"#include <QHash>#include <QDebug>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::M

qt学习(三):鼠标图标改变

qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #include <QtGui>  //光标类的父类 //再在public成员中声明换的函数void keyPressEvent(QKeyEvent *k); //声明按键换图的函数         .h文件    --注意头文件和声明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Qt学习总结-ui篇(二)

qccs定义圆角 border-radius:10px; 如果想给特定位置定义圆角,如: 左上角:border-left-top-radius:10px; 右下角色:border-right-bottom-rasius:10px; 半透明效果 只需要在css中使用rgba(100,100,100,40)这种形式来表示颜色即可. 为可执行文件添加图标 1.新建文件:finename.rc 文件名无所谓,只要后缀为rc就可以. 2.编辑新建的文件,输入以下内容: IDI_ICON1 ICON DIS

【qt学习005】搞不明白的布局

记录一下自己在布局这一章遇见的各种狗屎问题. 问题主要出现在布局最后一节:综合布局实例,类似于一个qq管理器的界面(见下图1).看见这个时,打算动手实现一下,于是开始写代码,写着写着发现不知道怎么写了,遇见一些无法解决的问题(问题中描述的布局类之间的关系见下图2): 1. 最底层应该使用哪一类? 2. 怎么将QListWidget加入到最底层? 3. 怎么往QStackWidget加入三个页面,每个页面代表不同的信息? 4. 怎么将QHBoxLayout中的CLOSE按钮连接到退出函数,要完整地

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

QT学习第1天

QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) (3)2005年QT4.0 (4)2008年被Nokia收购 (5)2009年源代码开源 (6)2012年Nokia将全部QT业务和知识产权卖给Digia公司 (7)2013年QT5.0 QT5.1 QT5.2 (8)2014年Digia公司成立 The Qt Company子公司 2.Qt5.4

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

Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学习之路:Qt学习之路(7):创建一个对话框(上)这个程序.编译出现 invalid use of incomplete type ‘class QPushButton’ findButton->setEnabled(!text.isEmpty()); ^ In file included from

qt学习(四)主窗选钮,显示新窗口。

游戏有选区这个习惯, 当然,我特指<冒险岛>了,有的时候就是打开一个主屏幕上五个按钮让你点击进入, 甚至有的时候进去了还要选哪个频道,游戏服务器都得分区,频道来完成功能.现在我们先进入想选的区,不需要的可以看以后的登陆窗口了. 这一次的主要功能是完成选区,选完进入输入账号界面. 这次用的是一个点完出啦一个所以需要两个窗口,在原有的基础上新建qt设计师界面类.选择dialogwithoutbutton. 把最后一个要显示的当作主界面, 其他的都可以选择dialog模板, 完成以后,画ui界面,