当前位置: 首页 > news >正文

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

Qt 时钟编程

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

1. 基本概念

  • QTimeQTime 是 Qt 中用于处理时间的类,它提供了方法来获取、计算、格式化时间,常用于实现时钟、计时器等功能。
  • QTimerQTimer 用于在指定的时间间隔内触发一个信号,可以用于定时执行某个操作。在时钟应用中,定时器可用于定期更新时间。
案例代码:
#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:000ui->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:000ui->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 构造函数
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);// 连接定时器的 timeout 信号到槽函数 timeout_slotconnect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));// 初始化时间为 00:00:00:000time.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 更新时间函数
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()
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()

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

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

  • 停止按钮(on_close_clicked()

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

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

  • 重置按钮(on_reset_clicked()

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

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

  • 记录时间段(on_bit_clicked()

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

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

相关文章:

  • 协作开发攻略:Git全面使用指南 — 第三部分 特殊应用场景
  • JW01三合一传感器详解(STM32)
  • 深度剖析操作系统核心(第一节):从X86/ARM/MIPS处理器架构到虚拟内存、分段分页、Linux内存管理,再揭秘进程线程限制与优化秘籍,助你成为OS高手!
  • Ubuntu 一站式部署 RabbitMQ 4 并“彻底”迁移数据目录的终极实践
  • 【回眸】Aurix TC397 IST 以太网 UDP 相关开发
  • 观成科技:摩诃草组织Spyder下载器流量特征分析
  • SpringCloud——负载均衡
  • Mediamtx与FFmpeg远程与本地推拉流使用
  • 信息系统项目管理工程师备考计算类真题讲解七
  • 【晶振】晶振的工作原理及其与单片机关系
  • 【C语言】C语言中的联合体与枚举类型
  • 网站高可用架构设计基础——高可用策略和架构原则
  • 关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?
  • Spring Boot + MyBatis-Plus 的现代开发模式
  • uniapp跨平台开发---switchTab:fail page `/undefined` is not found
  • HTML邮件背景图兼容 Outlook
  • HTML响应式网页设计与跨平台适配
  • 基于RFID的智能家居系统设计与实现
  • C++:函数重载
  • 【Python Web开发】02-Socket网络编程02
  • “住手!”特朗普罕见公开谴责普京,俄称愿恢复对话但要看美方行动
  • 上海举行金融服务企业“走出去”推进大会
  • 刺激视网膜可让人“看”到全新颜色
  • 主动权益基金一季度重仓股出炉:腾讯跃升至第一,阿里、比亚迪、中芯国际新进前十
  • 工程院院士应汉杰不再担任苏州大学校长
  • 世界最大全电驱可拆装环保绞吸船投入官厅水库清淤试点工程