Qt 时钟编程
在 Qt 中,通过 QTime
和 QTimer
类,我们可以轻松实现一个简单的时钟应用程序。本笔记将详细介绍如何结合这两个类实现一个精确的时钟,能够显示当前时间、启动/停止计时、重置时钟,以及记录时间段。
1. 基本概念
QTime
:QTime
是 Qt 中用于处理时间的类,它提供了方法来获取、计算、格式化时间,常用于实现时钟、计时器等功能。QTimer
:QTimer
用于在指定的时间间隔内触发一个信号,可以用于定时执行某个操作。在时钟应用中,定时器可用于定期更新时间。
案例代码:
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()
)cppvoid Widget::on_start_clicked() { timer.start(50); // 启动定时器,每 50 毫秒触发一次 }
当点击 "Start" 按钮时,定时器会以 50 毫秒的间隔触发
timeout_slot()
,每次增加 40 毫秒并更新显示。 -
停止按钮(
on_close_clicked()
)cppvoid Widget::on_close_clicked() { timer.stop(); // 停止定时器 }
点击 "Stop" 按钮时,定时器会停止,计时器将暂停。
-
重置按钮(
on_reset_clicked()
)cppvoid 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. 总结
在本例中,我们结合使用了 QTime
和 QTimer
来实现一个精确的计时器应用,展示了如何用 Qt 构建时钟功能,进行时间操作和界面更新。主要关键点包括:
-
使用
QTime
来处理和格式化时间。 -
使用
QTimer
来定时更新时间和触发事件。 -
使用按钮来控制计时器的启动、停止、重置,以及记录时间段。