要求:当系统时间达到输入的时间时,语音播报对话框中的内容。定时可以取消。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_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{ Q_OBJECTpublic: 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"); // 清除显示}