第六章 QT基础:6、QT的Qt 时钟编程
Qt 时钟编程
在 Qt 中,通过 QTime
和 QTimer
类,我们可以轻松实现一个简单的时钟应用程序。本笔记将详细介绍如何结合这两个类实现一个精确的时钟,能够显示当前时间、启动/停止计时、重置时钟,以及记录时间段。
1. 基本概念
QTime
:QTime
是 Qt 中用于处理时间的类,它提供了方法来获取、计算、格式化时间,常用于实现时钟、计时器等功能。QTimer
:QTimer
用于在指定的时间间隔内触发一个信号,可以用于定时执行某个操作。在时钟应用中,定时器可用于定期更新时间。
案例代码:
#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. 总结
在本例中,我们结合使用了 QTime
和 QTimer
来实现一个精确的计时器应用,展示了如何用 Qt 构建时钟功能,进行时间操作和界面更新。主要关键点包括:
-
使用
QTime
来处理和格式化时间。 -
使用
QTimer
来定时更新时间和触发事件。 -
使用按钮来控制计时器的启动、停止、重置,以及记录时间段。