第六章 QT基础:6、QT的Qt 时钟编程

Qt 时钟编程

在 Qt 中,通过 QTimeQTimer 类,我们可以轻松实现一个简单的时钟应用程序。本笔记将详细介绍如何结合这两个类实现一个精确的时钟,能够显示当前时间、启动/停止计时、重置时钟,以及记录时间段。

1. 基本概念

  • QTimeQTime 是 Qt 中用于处理时间的类,它提供了方法来获取、计算、格式化时间,常用于实现时钟、计时器等功能。
  • QTimerQTimer 用于在指定的时间间隔内触发一个信号,可以用于定时执行某个操作。在时钟应用中,定时器可用于定期更新时间。
案例代码:
C++ 复制代码
#include "widget.h"
#include "ui_widget.h"

static int i;

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    connect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));  
    // 连接定时器的 timeout 信号到 timeout_slot 函数
    time.setHMS(0, 0, 0, 0);  
    // 初始化时间为 00:00:00:000
    ui->showtime->setText("00:00:00:000");  
    // 显示初始化的时间
    QTimer *timer = new QTimer(this);  
    // 创建 QTimer 对象
    connect(timer, &QTimer::timeout, this, &Widget::updateTime);  
    // 每秒更新时间
    timer->start(1000);  
    // 启动定时器,每秒触发一次 timeout 信号
}

Widget::~Widget() {
    delete ui;  
    // 删除 UI 对象,释放内存
}

void Widget::updateTime() {
    QTime time = QTime::currentTime();  
    // 获取当前系统时间
    QString curtime = time.toString("hh:mm:ss");  
    // 格式化时间为 "hh:mm:ss" 字符串
    ui->currentime->setText(curtime);  
    // 更新 UI 上的 currentime 控件显示当前时间
}

void Widget::timeout_slot() {
    time = time.addMSecs(40);  // 每次调用时增加 40 毫秒
    ui->showtime->setText(time.toString("hh:mm:ss.zzz"));  
    // 更新 showtime 控件显示当前时间,包括毫秒
}

void Widget::on_start_clicked() {
    timer.start(50);  
    // 启动定时器,每 50 毫秒触发一次 timeout 信号
}

void Widget::on_close_clicked() {
    timer.stop();  
    // 停止定时器
}

void Widget::on_reset_clicked() {
    timer.stop();  
    // 停止计时器
    time.setHMS(0, 0, 0, 0);  
    // 将时间重置为 00:00:00:000
    ui->showtime->setText("00:00:00:000");  
    // 更新显示为 "00:00:00:000"
    ui->bittime->clear();  
    // 清空时间段记录
}

void Widget::on_bit_clicked() {
    QString temp;
    i = i + 1;  // 增加时间段编号
    temp.sprintf("%d", i);  // 将当前编号格式化为字符串
    ui->bittime->append(temp);  // 在 UI 中添加时间段编号
    ui->bittime->append(time.toString("hh:mm:ss.zzz"));  // 添加当前时间
}

2. 代码概述

以下代码实现了一个具有显示当前时间、启动计时、停止计时、重置计时和记录时间段功能的时钟。

2.1 构造函数
cpp 复制代码
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    // 连接定时器的 timeout 信号到槽函数 timeout_slot
    connect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));
    
    // 初始化时间为 00:00:00:000
    time.setHMS(0, 0, 0, 0);
    ui->showtime->setText("00:00:00:000");
    
    // 创建一个 QTimer,每秒触发一次更新时间
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Widget::updateTime);
    timer->start(1000);
}
  • connect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));
    这行代码将定时器的 timeout() 信号与 timeout_slot() 槽函数连接。每次定时器超时(例如,每 40 毫秒),就会调用 timeout_slot() 来更新时间。
  • time.setHMS(0, 0, 0, 0);
    这行代码初始化 QTime 对象 time,设置其为零点时间(00:00:00:000)。
  • QTimer *timer = new QTimer(this);
    创建一个新的 QTimer 对象,它会每 1000 毫秒(1 秒)触发一次 timeout 信号,用于更新时间显示。
2.2 更新时间函数
cpp 复制代码
void Widget::updateTime()
{
    QTime time = QTime::currentTime(); // 获取当前时间
    QString curtime = time.toString("hh:mm:ss"); // 格式化当前时间
    ui->currentime->setText(curtime); // 更新 UI 上的时间显示
}
  • QTime time = QTime::currentTime();
    获取当前系统时间,并将其存储在 time 对象中。
  • time.toString("hh:mm:ss");
    将当前时间格式化为字符串(时:分:秒)。
  • ui->currentime->setText(curtime);
    将格式化后的当前时间字符串显示在 currentime 控件上。
2.3 计时器槽函数(timeout_slot()
cpp 复制代码
void Widget::timeout_slot()
{
    // 每次调用时增加 40 毫秒
    time = time.addMSecs(40);
    ui->showtime->setText(time.toString("hh:mm:ss.zzz")); // 显示更新时间,包含毫秒
}
  • time.addMSecs(40);
    每次调用时,time 会增加 40 毫秒,模拟计时器的增加。这里设置了 40 毫秒为时间步长。
  • time.toString("hh:mm:ss.zzz");
    格式化时间字符串并显示,zzz 表示毫秒部分。
2.4 按钮控制函数
  • 开始按钮(on_start_clicked()

    cpp 复制代码
    void Widget::on_start_clicked()
    {
        timer.start(50);  // 启动定时器,每 50 毫秒触发一次
    }

    当点击 "Start" 按钮时,定时器会以 50 毫秒的间隔触发 timeout_slot(),每次增加 40 毫秒并更新显示。

  • 停止按钮(on_close_clicked()

    cpp 复制代码
    void Widget::on_close_clicked()
    {
        timer.stop();  // 停止定时器
    }

    点击 "Stop" 按钮时,定时器会停止,计时器将暂停。

  • 重置按钮(on_reset_clicked()

    cpp 复制代码
    void Widget::on_reset_clicked()
    {
        timer.stop(); // 停止计时
        time.setHMS(0, 0, 0, 0); // 重置时间为 00:00:00:000
        ui->showtime->setText("00:00:00:000"); // 更新显示
        ui->bittime->clear(); // 清空时间段记录
    }

    点击 "Reset" 按钮时,计时器停止并重置时间为 00:00:00:000,同时清空时间段记录。

  • 记录时间段(on_bit_clicked()

    cpp 复制代码

void Widget::on_bit_clicked()

{

QString temp;

i = i + 1; // 记录当前时间段的编号

temp.sprintf("%d", i); // 格式化编号

ui->bittime->append(temp); // 在 UI 中添加编号

ui->bittime->append(time.toString("hh:mm:ss.zzz")); // 添加当前时间

}

```

复制代码
点击 "Record" 按钮时,记录当前时间段(每点击一次记录一次当前的时间),并显示在界面的记录框 `bittime` 中。

3. 时钟功能总结

  • 当前时间显示 :使用 QTime::currentTime() 获取当前时间,并每秒更新时间。

  • 精确计时 :通过 QTime::addMSecs() 每 40 毫秒增加时间,模拟精确计时。

  • 控制定时器 :通过 QTimer 控制定时器每 50 毫秒触发一次,更新计时器显示。

  • 按钮控制:通过按钮来启动、停止、重置计时器,以及记录时间段。

4. 总结

在本例中,我们结合使用了 QTimeQTimer 来实现一个精确的计时器应用,展示了如何用 Qt 构建时钟功能,进行时间操作和界面更新。主要关键点包括:

  • 使用 QTime 来处理和格式化时间。

  • 使用 QTimer 来定时更新时间和触发事件。

  • 使用按钮来控制计时器的启动、停止、重置,以及记录时间段。

相关推荐
董先生_ad986ad1 小时前
C# 中的 `lock` 关键字本质
开发语言·c#
元亓亓亓2 小时前
Java后端开发day36--源码解析:HashMap
java·开发语言·数据结构
道剑剑非道2 小时前
QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
开发语言·qt·conda
小邓儿◑.◑2 小时前
C++武功秘籍 | 入门知识点
开发语言·c++
码银4 小时前
Java 集合:泛型、Set 集合及其实现类详解
java·开发语言
大G哥4 小时前
PHP标签+注释+html混写+变量
android·开发语言·前端·html·php
傻啦嘿哟4 小时前
HTTP代理基础:网络新手的入门指南
开发语言·php
fish_study_csdn4 小时前
pytest 技术总结
开发语言·python·pytest
曹牧5 小时前
Java 调用webservice接口输出xml自动转义
java·开发语言·javascript
pyengine6 小时前
基于pandoc的MarkDown格式与word相互转换小工具开发(pyqt5)
开发语言·python·qt·word