Label上显示系统时间,程序运行就要有。
Lable2,:请输入闹钟的事件 行编辑器和启动按钮。启动按钮之后,到了行编辑器内的时间后,就开始语音播报最下方label中的内容。
语音播报5次
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>
#include <QTime> // 时间类
#include <QTimerEvent> // 定时事件类
#include <QTextToSpeech> // 语音播报类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();// 重写定时器事件函数void timerEvent(QTimerEvent *e) override;private slots:void on_timerPB_clicked(); // 启动定时器的槽函数private:Ui::Widget *ui;int id; // 定时器1的ID(系统时间)int id2; // 定时器2的ID(闹钟定时器)QTextToSpeech *speecher; // 语音播报器对象
};#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) // 初始化语音播报器
{ui->setupUi(this);// 显示当前系统时间到 systimeLabQString t = QTime::currentTime().toString("hh:mm:ss"); // 获取当前系统时间并格式化为字符串ui->systimeLab->setText("系统时间:" + t); // 将当前时间显示在 systimeLab 标签上ui->systimeLab->setAlignment(Qt::AlignCenter); // 设置标签文本居中显示// 启动一个 1 秒间隔的定时器,用于实时更新系统时间id = startTimer(1000); // 定时器以 1 秒为间隔触发
}Widget::~Widget()
{delete ui; // 释放 UI 资源
}// 定时器事件处理函数
void Widget::timerEvent(QTimerEvent *e)
{// 判断是否为系统时间更新的定时器if (e->timerId() == id){// 实时更新系统时间QTime sys_time = QTime::currentTime(); // 获取当前时间QString t = sys_time.toString("hh:mm:ss"); // 转换为 "hh:mm:ss" 格式的字符串ui->systimeLab->setText(t); // 更新 systimeLab 标签显示时间}// 判断是否为闹钟触发的定时器else if (e->timerId() == id2){// 获取用户输入的文本内容QString textToSpeak = ui->txtLab->text(); // 从 txtLab 文本框中获取需要播报的文本内容// 循环播报文本三遍for (int i = 0; i < 3; ++i){speecher->say(textToSpeak); // 使用 QTextToSpeech 播报文本内容qDebug() << "语音播报第" << (i + 1) << "次:" << textToSpeak; // 在调试输出中记录播报次数和内容}// 关闭闹钟定时器killTimer(id2); // 停止闹钟定时器id2 = 0; // 将闹钟定时器 ID 重置为 0// 在事件标签中显示提示信息ui->eventLab->setText("闹钟触发,已播报三遍!"); // 在 eventLab 标签中显示提示信息ui->eventLab->setAlignment(Qt::AlignCenter); // 设置标签文本居中显示}
}// 启动定时器按钮的槽函数
void Widget::on_timerPB_clicked()
{// 获取用户设置的目标时间QString t1 = ui->lineEdit->text(); // 从 lineEdit 输入框中读取用户输入的时间QTime time1 = QTime::currentTime(); // 获取当前时间QTime time2 = QTime::fromString(t1, "hh:mm:ss"); // 将用户输入的时间转换为 QTime 对象// 检查用户输入的时间是否有效if (!time2.isValid() || time1 >= time2) // 检查时间格式是否正确,且目标时间晚于当前时间{qDebug() << "输入时间无效或早于当前时间"; // 输出调试信息ui->eventLab->setText("时间无效,请输入有效时间!"); // 在 eventLab 标签中提示用户输入错误ui->eventLab->setAlignment(Qt::AlignCenter); // 设置标签文本居中显示return; // 退出函数,不设置定时器}// 计算当前时间与目标时间的时间差(以毫秒为单位)int cha = time1.msecsTo(time2); // 计算目标时间与当前时间之间的毫秒数差qDebug() << "相差毫秒数:" << cha; // 输出调试信息,显示时间差// 启动闹钟定时器id2 = startTimer(cha); // 设置定时器,超时时间为目标时间与当前时间的差值ui->eventLab->setText("闹钟已设置!"); // 在 eventLab 标签中提示闹钟已设置ui->eventLab->setAlignment(Qt::AlignCenter); // 设置标签文本居中显示qDebug() << "闹钟设置成功,间隔时间:" << cha / 1000 << "秒"; // 输出调试信息,显示闹钟触发间隔
}