第六章 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 来定时更新时间和触发事件。

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

相关推荐
TNTLWT12 分钟前
Qt控件:交互控件
开发语言·qt
量化金策14 分钟前
震荡指标工具
开发语言
北漂老男孩16 分钟前
ChromeDriver进程泄漏问题分析与最佳实践解决方案
开发语言·爬虫
李迟21 分钟前
Golang实践录:在go中使用curl实现https请求
开发语言·golang·https
运维-大白同学1 小时前
go-数据库基本操作
开发语言·数据库·golang
动感光博2 小时前
Unity(URP渲染管线)的后处理、动画制作、虚拟相机(Virtual Camera)
开发语言·人工智能·计算机视觉·unity·c#·游戏引擎
蚰蜒螟2 小时前
深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)
开发语言·jvm·python
keke103 小时前
Java【14_2】接口(Comparable和Comparator)、内部类
java·开发语言
思茂信息3 小时前
CST软件对OPERA&CST软件联合仿真汽车无线充电站对人体的影响
c语言·开发语言·人工智能·matlab·汽车·软件构建
CN.LG3 小时前
Java 乘号来重复字符串的功能
java·开发语言