【QT】自制一个简单的小闹钟,能够实现语音播报功能

news2024/11/25 12:39:28

        做了一个自制的小闹钟,能够自己输入时间,以及对应的闹铃,时间到了自动播放设定的闹铃,可以随时取消重新设定,采用分文件编译

        注意:需要在.pro文件中加入:QT       += core gui texttospeech

代码如下:

wideget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QKeyEvent>     //键盘事件类
#include <QMouseEvent>   //鼠标事件类
#include <QIcon>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QMovie>
#include <QObject>
#include <QMessageBox>
#include <QTimer>            //定时器类
#include <QTime>             //时间类
#include <QTimerEvent>       //定时器事件类
#include <QDateTime>         //日期时间类
#include <QTextToSpeech>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

signals:


public slots:
    void start_slots();
    void timeout_slots();     //自定义处理超时信号的槽函数
    void cancel_slots();     //自定义取消按钮槽函数

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void mouseMoveEvent(QMouseEvent *event);       //鼠标移动事件
    void mousePressEvent(QMouseEvent *event);      //鼠标点击事件

    void speakText(const QString &text);

private:
    Ui::Widget *ui;
    QPoint temp;                //移动窗口中间辅助向量
    QLabel *system_time,*lab1;         //显示系统时间
    QLineEdit *mod_time,*clock_txt;             //可编辑的时间、闹钟输出的文字
    QPushButton *start_button,*cancel_button;   //启动按钮和取消按钮

    int tid = 0;       //定时器id号
    QTimer t1;        //定义一个定时器变量


};
#endif // WIDGET_H

main.cpp

#include "widget.h"

#include <QApplication>

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

 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setFixedSize(500,500);                    //设置页面初始尺寸大小
    this->setWindowFlag(Qt::FramelessWindowHint);   //将头部隐藏

    //标签类
    system_time = new QLabel(this);          //系统时间
    system_time->resize(200,140);
    system_time->move(50,50);
    system_time->setScaledContents(true);
    system_time->setStyleSheet("background-color:pink; border-radius:20;\
                                font-size:20px;font-weight:bold");
    system_time->setWindowOpacity(0.1);

    //按钮类
    start_button = new QPushButton("启动",this);
    cancel_button = new QPushButton("取消",this);

    //设置位置
    start_button->move(system_time->x()+system_time->width()+15,110);
    cancel_button->move(start_button->x()+start_button->width()+5,start_button->y());
    //设置大小
    start_button->resize(90,80);
    cancel_button->resize(90,80);
   // start_button->setStyleSheet("border-radius:20");

    //行标签类
    mod_time = new QLineEdit(this);
    mod_time->move(system_time->y()+system_time->width()+15,system_time->y());
    mod_time->setPlaceholderText("输入定时");
    mod_time->resize(180,30);

    clock_txt = new QLineEdit(this);
    clock_txt->move(50,230);
    clock_txt->resize(400,250);
    clock_txt->setPlaceholderText("输入闹铃");

    // 设置文本对齐到左上角
    clock_txt->setAlignment(Qt::AlignLeft | Qt::AlignTop);
    clock_txt->setStyleSheet("QLineEdit { padding-left: 0px; }");

    //连接信号与槽,按下按钮开始执行功能
    connect(start_button, &QPushButton::clicked, this, &Widget::start_slots);
    connect(&t1, &QTimer::timeout, this, &Widget::timeout_slots);
    connect(cancel_button, &QPushButton::clicked, this, &Widget::cancel_slots);
}

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

//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - temp);
}

//鼠标点击事件
void Widget::mousePressEvent(QMouseEvent *event)
{
    temp = event->globalPos() - this->pos();    //求出中间辅助变量
    if(event->button() == Qt::RightButton)
    {
        this->close();
    }
}


void Widget::start_slots()
{
    t1.start(1000);          //每隔指定时间,发送一个timeout信号
}

void Widget::timeout_slots()
{
    //获取系统时间
    QTime sysTime = QTime::currentTime();
    //将QTime类对象转变成字符串
    QString sysTimeStr = sysTime.toString("hh:mm:ss");
    this->system_time->setText(sysTimeStr);
    system_time->setAlignment(Qt::AlignCenter);

    //将3个地方设置成不可点击
    start_button->setEnabled(false);
    mod_time->setReadOnly(true);
    clock_txt->setReadOnly(true);

    //比较逻辑,如果和我输入的时间相等,就发出声音
    QString modTimeStr = mod_time->text();
    if(sysTimeStr == modTimeStr)
    {
        qDebug()<<"发出声音";
        speakText(clock_txt->text());
    }
}

void Widget::cancel_slots()
{
    int res = QMessageBox::information(this,
                                       "提示",
                                       "真的要取消么",
                                       QMessageBox::Yes|QMessageBox::No,
                                       QMessageBox::Yes);
    if(res == QMessageBox::Yes)
    {
        qDebug()<<"解除限制功能";
        t1.stop();
        start_button->setEnabled(true);
        mod_time->setReadOnly(false);
        clock_txt->setReadOnly(false);

    }
    else if(res == QMessageBox::No)
    {
        qDebug()<<"继续执行程序";
    }
}

void Widget::speakText(const QString &text)
{
    QTextToSpeech *speaker = new QTextToSpeech;
    speaker->say(text);
}

输出结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用C++编写一个语音播报时钟(Qt)

要求&#xff1a;当系统时间达到输入的时间时&#xff0c;语音播报对话框中的内容。定时可以取消。qt界面如上图所示。组件如下&#xff1a; countdownEdit作为书写目标时间的line_edit start_btn作为开始和停止的按钮 stop_btn作为取消的按钮 systimelab显示系统时间的lab tex…

绿色医院建的中央空调无线集中控制系统

在医疗服务水平不断提高的今天&#xff0c;空调能耗已成为医院建筑能耗的主要组成部分&#xff0c;达到总建筑能耗的50%至60%。如何提高医院中央空调系统的能效&#xff0c;成为绿色医院建设中亟待解决的问题。而中央空调无线集中控制系统的出现&#xff0c;为医院节能运行提供…

Etsy店铺又被封了?教你申诉和防封技巧!

熟悉美国Etsy平台的用户都知道&#xff0c;该平台对店铺的监管非常严格&#xff0c;店铺被封的情况时有发生。 无论是新开的店铺&#xff0c;还是已经有一定订单量的店铺&#xff0c;都可能面临被封的风险&#xff0c;突如其来的封号&#xff0c;会让很多卖家束手无策。 那么&a…

国内AI论文写作推荐工具有哪些?试试这7款

在当前信息爆炸的时代&#xff0c;AI写作工具已经成为学术研究和写作的重要助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助用户生成高质量的文稿。以下是七款值得推荐的国内AI论文写作工具&#xff1a; 一、千笔-AIPassPaper 千笔-AIPassPaper是一款功能强大且全面…

MDK keil STM32 局部变量不能查看值,显示为not in scope

用MDK调试程序&#xff0c;查看变量时watch窗口总是和 一、方法1&#xff1a;优化级别改为Level 0 1 编译器把这个局部变量给优化掉了&#xff0c;并没有在内存中生成&#xff0c;把优化级别改为Level 0&#xff0c;重新编译。 Keil默认优化是等级3&#xff0c;最高优化&…

MMO 地图传送,UI系统框架设计

地图传送 创建传送点 建碰撞器触发 //位置归零 建一个传送门cube放到要传送的位置&#xff08;这个teleporter1是传出的区域 这是从另一张地图传入时的传送门 创建一个脚本TeleporterObject给每个传送cube都绑上脚本 通过脚本&#xff0c;让传送门在编辑器下面还能绘制出来 …

第三部分:6---进程程序替换

目录 进程替换&#xff1a; execl函数解析&#xff1a; 多进程替换的本质&#xff1a; exec系列函数解析&#xff1a; 进程替换不会替换原进程的环境变量&#xff1a; 进程替换&#xff1a; 通过 fork 创建的进程&#xff0c;在最初会执行父进程代码的一部分&#xff0c;这…

动态规划-最长回文子序列

题目描述 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s "bcbbab…

图书馆上新了!新华书店×度小满推出“开学季悦读计划”公益活动

2024年9月&#xff0c;新学期伊始&#xff0c;度小满携手新华书店启动“开学季悦读计划”公益行动。本次活动以“开学季&#xff0c;图书馆上新书”为主题&#xff0c;向度小满“小满助力计划”公益项目落地过的五个地区共六所小学和初中捐赠3300余本图书&#xff0c;让孩子们开…

李飞飞团队 ReKep:空间智能机器人可整合 GPT-4o;苹果首款 AI 手机 iPhone 16 发布丨RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

一款专业编曲软件Guitar Pro 8中文版安装激活图文教程

Guitar Pro 8中文版是一款专业编曲软件&#xff0c;帮助所有的吉他爱好者学习、创作、设计、绘谱&#xff0c;指法、音色&#xff0c;了解各种吉他方面的内容&#xff0c;除了吉他还有其他十种乐器可以使用&#xff0c;节省时间&#xff0c;提高效率&#xff0c;有助于学习如何…

LLM大模型学习:AI Agent综述

AI Agent是什么 将LLM思想链接到一起&#xff0c;自主实现用户设定的任何目标。只需要告诉AutoGPT一个目标&#xff0c;能自主生成执行计划。 吴恩达&#xff1a;“与其争论哪些工作才算是真正的 Agent&#xff0c;不如承认系统可以具有不同程度的 Agentic 特性。” 核心在于…

TCP 为什么是三次握手,而不是两次或四次?(通俗易懂)

TCP 三次握手是为了保证&#xff1a;让客户端和服务器都知道自己和对方的发送和接收都没问题。 换句话说&#xff0c;可以 假设客户端和服务端都维护了四个布尔变量&#xff1a;自己发送&#xff0c;自己接收&#xff0c;对方发送&#xff0c;对方接收。 初始值为 false&#…

ROS第三梯:ROS+C++实现速腾Bag包的解析

解决问题&#xff1a;速腾Bag包利用bag_to_pcd生成的pcd文件字段名称存在问题&#xff0c;多了几个异常的"_"&#xff0c;导致强度属性无法在Intensity中显示。 解决方案&#xff1a;利用sensor_msgs库进行数据读取和转换成sensor_msgs::PointCloud格式&#xff0c;再…

避免17个最常见的电子邮件营销错误

我们都曾在电子邮件营销中犯过错。你点击发送&#xff0c;随后那种沉重的感觉袭来。你搞砸了&#xff0c;现在所有人都能看到。就像把信息放入瓶子丢进互联网的浩瀚海洋中&#xff0c;无法收回。 有些电子邮件营销错误显而易见&#xff0c;可能会破坏你投入了大量心血的营销活…

多窗口联系

使用信号和槽实现多个界面的跳转 准备好两个界面 一个界面准备好信号 一个界面准备好槽 连接两个界面的信号和槽 主界面的头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Wi…

俄罗斯电商没有技巧,OZON换季相关爆品

Top1 加热器 Обогреватель кварцевый напольный ИЖЭКО М 800 вт СВ01 энергосберегающий электрообогреватель 商品id&#xff1a;1352359815 月销量&#xff1a;781 OZON选品分析工具&#…

Xilinx系FPGA学习笔记(六)RAM的IP核学习

系列文章目录 文章目录 系列文章目录块RAM生成 块RAM生成 对于RAM来说&#xff0c;也有两种: 在 Memories & Storage Elements 下&#xff0c;一个是 Distributed Memory Generator&#xff0c;另一个是 BlockMemory Generator&#xff0c;这与ROM是类似的 这里的常规接口…

CSP-CCF★★★201812-2小明放学★★★

目录 一、问题描述 二、解答 &#xff08;1&#xff09;注意&#xff1a; &#xff08;2&#xff09;80分版&#xff1a; &#xff08;3&#xff09;100分版&#xff1a; 三、总结 一、问题描述 二、解答 &#xff08;1&#xff09;注意&#xff1a; 题目的n小于等于10的…

9月10(信息差)

&#x1f30d;华为最便宜小折叠&#xff01;华为nova Flip今晚发布&#xff1a;搭载麒麟8000芯片 从曝光的跑分信息来看&#xff0c;nova Flip将搭载麒麟8000处理器&#xff0c;也就是nova 12 Pro/Ultra的同款&#xff0c;采用8核心的134组合&#xff0c;大核是1颗2.4GHz的Cort…