QT实现闹钟
要求如下
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QTimer> //定时器类
#include <QTime> //时间类
#include <QTextToSpeech> //播报者头文件
#include <QTimerEvent> //定时器事件类
#include <QDateTime> //日期时间类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//重写定时器事件处理函数
void timerEvent(QTimerEvent *event)override;
private slots:
void LCD_Show();
void on_StartBtn_clicked();
void on_CloseBtn_clicked();
private:
Ui::Widget *ui;
// 定义LCD屏时间显示的定时器
QTimer *lcd_time;
// 定义一个bool类型变量:实现:以秒闪烁
bool ShowFlag = true;
// 定义文本输入框的播报者
QTextToSpeech *Text_Speech;
// 定义闹钟定时器
int clock_time;
// 定义重复播报定时器
int Respeech_time;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置固定尺寸
this->setFixedSize(800,600);
// 更改窗口标题
this->setWindowTitle("闹钟");
// 给LCD屏定时器实例化对象
lcd_time = new QTimer(this);
// 将timeout信号与处理的槽函数连接
connect(lcd_time,&QTimer::timeout,this,&Widget::LCD_Show);
// 启动LCD屏定时器
lcd_time->start(1000);
// 设置取消按钮为不可用状态
ui->CloseBtn->setEnabled(false);
// 实例化文本输入框的播报者
Text_Speech = new QTextToSpeech(this);
}
Widget::~Widget()
{
delete ui;
}
//将系统时间在DateLcd上显示
//获取系统当前时间
// LCD屏显示时间的槽函数
void Widget::LCD_Show()
{
// 获取当前系统时间
QTime sys_time = QTime::currentTime();
// 将当前系统时间转化为字符串
QString string_time = sys_time.toString("hh:mm");
// 实现:以秒闪烁
if(ShowFlag)
{
string_time[2] = ':';
ShowFlag = false;
}else {
string_time[2] = ' ';
ShowFlag = true;
}
//全局
// 展示到ui界面
ui->DateLcd->display(string_time);
}
//输入数据到lineEdit,然后读取lineEdit的内容,判断是否触发“停止”按钮的状态
//点击“开始”按钮,每秒都与系统时间比较,刷新状态,相同触发语音播报“textedit”的内容
//同时判断“停止”按钮是否触发,若触发则停止播报。
// 启动按钮对应的槽函数
void Widget::on_StartBtn_clicked()
{
// 设置启动按钮为不可用状态
ui->StartBtn->setEnabled(false);
// 设置取消按钮为可用状态
ui->CloseBtn->setEnabled(true);
// 设置文本输入框为不可用状态
ui->textEdit->setEnabled(false);
// 设置时间输入框为不可用状态
ui->DateEdit->setEnabled(false);
// 启动闹钟定时器
clock_time = this->startTimer(1000);//每间隔1秒启动一下定时器对应的函数
}
//停止按钮,两种状态:
//lineedit无内容为不可点击状态;
//输入时间格式正确,按钮变更为可以点击状态
// 取消按钮对应的槽函数
void Widget::on_CloseBtn_clicked()
{
// 设置启动按钮为可用状态
ui->StartBtn->setEnabled(true);
// 设置取消按钮为不可用状态
ui->CloseBtn->setEnabled(false);
// 设置文本输入框为可用状态
ui->textEdit->setEnabled(true);
// 设置时间输入框为可用状态
ui->DateEdit->setEnabled(true);
// 关闭重复播报定时器
this->killTimer(Respeech_time);
// 清空时间数据输入框
ui->DateEdit->clear();
// 清空文本数据输入框
ui->textEdit->clear();
// 停止语音播报
Text_Speech->stop();
}
//重写时间发生事件实时更新状态
//获取系统时间
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId() == clock_time)
{
// 获取当前系统时间
QTime sys_time = QTime::currentTime();
// 将当前系统时间转化为时间字符串
QString string_time = sys_time.toString("hh:mm");//选用类型为lcd 只能显示5位数据
// 与时间输入框中的数据对比
if(string_time == ui->DateEdit->text())
{
// 关闭闹钟定时器
this->killTimer(clock_time);
// 启动重复播报定时器
Respeech_time = this->startTimer(5000);
// 语音播报起床文本内容
Text_Speech->say(ui->textEdit->toPlainText());
}
}
if(event->timerId() == Respeech_time)
{
// 每隔5秒语音播报起床文本内容
Text_Speech->say(ui->textEdit->toPlainText());
}
}