要求:当系统时间达到输入的时间时,语音播报对话框中的内容。定时可以取消。qt界面如上图所示。组件如下:
countdownEdit作为书写目标时间的line_edit
start_btn作为开始和停止的按钮
stop_btn作为取消的按钮
systimelab显示系统时间的lab
textEdit显示播报内容
代码:头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTimer> //定时器类
#include<QTime> //时间类
#include<QTimerEvent> //定时器事件类
#include<QDateTime> //日期时间类
#include <QtTextToSpeech>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_stop_btn_clicked();
void on_start_btn_clicked();
void sys_time_slot();
private:
Ui::Widget *ui;
//定义一个定时器变量
QTimer t1;
int tid = 0; //定时器id号
//void timerEvent(QTimerEvent *event) override;
//定时器事件处理函数的声明
QTextToSpeech *textToSpeech;
};
#endif // WIDGET_H
程序文件:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget), textToSpeech(new QTextToSpeech(this))
{
ui->setupUi(this);
// 由于定时器事件的信号与槽的绑定只需要一次,所以直接写在构造函数中即可
connect(&t1, &QTimer::timeout, this, &Widget::sys_time_slot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_start_btn_clicked()
{
if (ui->start_btn->text() == "启动")
{
t1.start(1000); // 每隔指定的时间,发送一个systime的信号
ui->start_btn->setText("停止");
}
else
{
t1.stop();
ui->start_btn->setText("启动");
}
}
void Widget::sys_time_slot()
{
// 获取系统的时间
QTime sysTime = QTime::currentTime();
// 将QTime类对象转变成字符串
QString tm = sysTime.toString("hh:mm:ss");
// 将时间展示到ui界面上
ui->systimelab->setText(tm);
// 设置标签居中显示
ui->systimelab->setAlignment(Qt::AlignCenter);
// 比较系统时间和用户输入的时间
if (tm == ui->countdownEdit->text())
{
ui->textEdit->append("三更灯火五更鸡,\n正是男儿读书时,\n黑发不知勤学早,\n白首方悔读书迟。");
// 语音播报
textToSpeech->say(ui->textEdit->toPlainText());
}
}
void Widget::on_stop_btn_clicked()
{
ui->start_btn->setText("启动");
ui->countdownEdit->setText("00:00:00"); // 清除显示
}