QT 第四讲 作业

语音播报闹钟

main.cpp

#include <QApplication>
#include <QPushButton>
#include "mainwindow.h"

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);
  MainWindow w;
  w.show();
  return QApplication::exec();
}

mainwindow.h

#ifndef HOMEWORK_MAINWINDOW_H
#define HOMEWORK_MAINWINDOW_H

#include <QWidget>
#include <QEvent>
#include <QMessageBox>
#include <QtTextToSpeech/QtTextToSpeech>


QT_BEGIN_NAMESPACE
namespace Ui {
  class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QWidget {
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = nullptr);
  ~MainWindow() override;

private:
  Ui::MainWindow *ui;
  QTextToSpeech *tts;
  bool countdown_flag; // 是否在倒计时状态
  bool inspeech_flag;  // 是否在播报状态
  int clock_id;  // 时钟定时器的 id
  int count_id;  // 倒计时定时器的 id
  void timerEvent(QTimerEvent *event) override;

public slots:
  void onStartBtnClicked();
  void onStopBtnClicked();
};


#endif//HOMEWORK_MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
      QWidget(parent), ui(new Ui::MainWindow),
      countdown_flag(false), inspeech_flag(false) {

  this->clock_id = this->startTimer(1000);
  tts = new QTextToSpeech(this);
  tts->setLocale(QLocale::Chinese);
  ui->setupUi(this);

  ui->timeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
  ui->timeEdit->setAlignment(Qt::AlignCenter);
  // 给 TimeEdit 设置当前时间
  ui->timeEdit->setCalendarPopup(true);
  ui->timeEdit->setMinimumDate(QDate::currentDate());
  ui->timeEdit->setTime(QTime::currentTime());
  // 给按钮设置初始状态
  ui->stopBtn->setEnabled(false);
  // 给按钮点击绑定槽函数
  connect(ui->startBtn, &QPushButton::clicked, this, &MainWindow::onStartBtnClicked);
  connect(ui->stopBtn, &QPushButton::clicked, this, &MainWindow::onStopBtnClicked);
}

MainWindow::~MainWindow() {
  delete ui;
}

void MainWindow::onStartBtnClicked() {
  // 获取倒计时的时间
  QTime t = ui->timeEdit->time();
  if (t < QTime::currentTime()) {
    QMessageBox::warning(this, "警告", "倒计时时间不能小于当前时间");
    return;
  }// else...
  // 设置倒计时标志
  this->countdown_flag = true;
  ui->startBtn->setEnabled(false);
  ui->stopBtn->setEnabled(true);
  ui->timeEdit->setEnabled(false);
  ui->textEdit->setEnabled(false);
  // 开始倒计时
  this->count_id = this->startTimer(1000);
}

void MainWindow::onStopBtnClicked() {
  // 停止倒计时
  this->killTimer(this->count_id);
  this->count_id = 0;
  // 恢复按钮状态
  ui->startBtn->setEnabled(true);
  ui->stopBtn->setEnabled(false);
  ui->timeEdit->setEnabled(true);
  ui->textEdit->setEnabled(true);
  // 恢复时钟
  this->countdown_flag = false;
}

void MainWindow::timerEvent(QTimerEvent *event) {
  QTime now = QTime::currentTime();
  if (event->timerId() == clock_id) { // 每秒都会执行
      // 如果不在倒计时状态就刷新显示时间
      if (!countdown_flag) {
         QString t_str = now.toString("hh:mm:ss");
         ui->timeLabel->setText(t_str);
       }
      // 如果在播报状态但播报已经结束,切换状态
      if (inspeech_flag && QTextToSpeech::Speaking != tts->state()) {
          inspeech_flag = false;
		  // 恢复按钮状态
		  ui->startBtn->setEnabled(true);
		  ui->stopBtn->setEnabled(false);
		  ui->timeEdit->setEnabled(true);
		  ui->textEdit->setEnabled(true);
		  // 恢复时钟
		  this->countdown_flag = false;
      }
  } else if (event->timerId() == count_id) {
    QTime t = ui->timeEdit->time();
    if (now >= t) {
      // 倒计时结束
      this->killTimer(this->count_id);
      this->count_id = 0;
      // 播放语音
      QString text = ui->textEdit->toPlainText();
      tts->say(text);
      this->inspeech_flag = true;
    } else {
      // 倒计时未结束
      int secs = QTime::currentTime().secsTo(ui->timeEdit->time());
      QString secs_str = QString::number(secs);
      ui->timeLabel->setText("倒计时:" + secs_str);
    }
  }
}

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QWidget" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>916</width>
    <height>542</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QLabel" name="timeLabel">
   <property name="geometry">
    <rect>
     <x>60</x>
     <y>50</y>
     <width>371</width>
     <height>131</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>微软雅黑</family>
     <pointsize>35</pointsize>
     <weight>75</weight>
     <bold>true</bold>
    </font>
   </property>
   <property name="styleSheet">
    <string notr="true">border: 1px solid #ddd;</string>
   </property>
   <property name="text">
    <string/>
   </property>
  </widget>
  <widget class="QDateTimeEdit" name="timeEdit">
   <property name="geometry">
    <rect>
     <x>460</x>
     <y>50</y>
     <width>401</width>
     <height>61</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>文泉驿等宽微米黑</family>
     <pointsize>16</pointsize>
    </font>
   </property>
  </widget>
  <widget class="QPushButton" name="startBtn">
   <property name="geometry">
    <rect>
     <x>460</x>
     <y>130</y>
     <width>191</width>
     <height>51</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>文泉驿等宽微米黑</family>
     <pointsize>20</pointsize>
    </font>
   </property>
   <property name="cursor">
    <cursorShape>PointingHandCursor</cursorShape>
   </property>
   <property name="text">
    <string>开始</string>
   </property>
  </widget>
  <widget class="QPushButton" name="stopBtn">
   <property name="geometry">
    <rect>
     <x>670</x>
     <y>130</y>
     <width>191</width>
     <height>51</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>文泉驿等宽微米黑</family>
     <pointsize>20</pointsize>
    </font>
   </property>
   <property name="cursor">
    <cursorShape>PointingHandCursor</cursorShape>
   </property>
   <property name="text">
    <string>停止</string>
   </property>
   <property name="icon">
    <iconset theme="start">
     <normaloff>.</normaloff>.</iconset>
   </property>
   <property name="checkable">
    <bool>false</bool>
   </property>
   <property name="checked">
    <bool>false</bool>
   </property>
  </widget>
  <widget class="QTextEdit" name="textEdit">
   <property name="geometry">
    <rect>
     <x>60</x>
     <y>210</y>
     <width>801</width>
     <height>301</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>文泉驿等宽微米黑</family>
     <pointsize>16</pointsize>
    </font>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值