当前位置: 首页 > news >正文

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

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

        注意:需要在.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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals: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);
}

输出结果如下:

相关文章:

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

做了一个自制的小闹钟&#xff0c;能够自己输入时间&#xff0c;以及对应的闹铃&#xff0c;时间到了自动播放设定的闹铃&#xff0c;可以随时取消重新设定&#xff0c;采用分文件编译 注意&#xff1a;需要在.pro文件中加入&#xff1a;QT core gui texttospeech 代码…...

基于深度学习的图像描述生成

基于深度学习的图像描述生成&#xff08;Image Captioning&#xff09;是一种将计算机视觉与自然语言处理结合的任务&#xff0c;其目标是通过自动生成自然语言来描述输入的图像。该技术能够理解图像中的视觉内容&#xff0c;并生成相应的文本描述&#xff0c;广泛应用于视觉问…...

Linux和C语言(Day11)

一、学习内容 讲解有参函数 形参 和 实参 形参——定义时的参数&#xff0c;形式上的参数&#xff0c;没有实际意义&#xff0c;语法上必须带有数据类型 void fun(int a,int b); void fun(int a[],int n); void fun(char *s); 可以是&#xff1a;变量、数组、指针 实参——调用…...

使用Zlib库进行多文件或者多文件夹的压缩解压缩

zlib库可在git上自己clone下来然后使用cmake工具生成解决方案&#xff0c;编译、生成zlib二进制文件。然后将zlib库引入项目&#xff1a; //zlib库支持 #include "../zlib/include/zlib.h" #ifdef _DEBUG #pragma comment(lib, "../zlib/lib/zlibd.lib") …...

CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案

强强联合 人工智能与大数据的迅速发展&#xff0c;大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分&#xff0c;企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战&#xff0c;CSGHub、Nvidia和阿里云计算巢强强联手&a…...

opencv的球面投影

cv::detail::SphericalProjector 在全景图像拼接任务中&#xff0c;可能需要对多个图像进行球面投影以实现无缝拼接。每个cv::detail::SphericalProjector可以负责一个图像的球面投影操作。通过将多个这样的投影器存储在std::vector中&#xff0c;可以对一组图像依次进行投影处…...

5. 去中心化应用(dApp)

去中心化应用&#xff08;dApp&#xff09; 去中心化应用&#xff08;dApp&#xff09;是基于区块链技术构建的应用程序&#xff0c;其核心特性是去中心化、透明和开放。dApp与传统应用有许多显著的区别&#xff0c;它们在实现和功能上都带来了新的变革。以下是对dApp的详细介…...

k8s服务发布Ingress

Kubernetes暴露服务的方式目前只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff0c;通俗来讲&#xff0c;ingress和之前提到的Service、Deployment&#xff0c;也是一个k8s的资源类型&#xff0c;ingress用于实现用域名的方式访问k8s内部应用。 In…...

区块链学习笔记1--比特币

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说&#xff1a;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…...

在 Vite 项目中自动为每个 Vue 文件导入 base.less

在 Vue.js 项目中&#xff0c;使用 Less 作为 CSS 预处理器时&#xff0c;我们通常会创建一个全局的样式文件&#xff08;如 base.less&#xff09;&#xff0c;用于存放一些全局变量、混合、通用样式等。为了避免在每个 Vue 组件中手动导入这个文件&#xff0c;我们可以通过配…...

RUST 学习之全局变量

RUST 全局变量 rust 全局变量编译期初始化的全局变量静态常量静态变量原子类型的静态变量 运行期初始化的全局变量lazy_staticBox::leakOnceCell & OnceLock 参考文档 rust 全局变量 编译期初始化的全局变量 静态常量 在编译期初始化&#xff0c;所以其赋值只能是表达式…...

代码随想录八股训练营第三十九天| C++

前言 一、说一下 lambda函数&#xff1f; 1.1.Lambda 函数的一般语法如下: 1.2.捕获子句&#xff1a; 二、C 怎么实现一个单例模式&#xff1f; 2.1.懒汉式&#xff08;线程不安全&#xff09;: 2.2.饿汉式&#xff08;线程安全&#xff09;: 2.3.双重检查锁定&#xff…...

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…...

单链表的实现(C语言)

目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构&#xff0c;物理结构不连续&#xff0c;逻辑结构是连续的&#xff0c;在计算机中链表的实际存储是按照一个结点内存放…...

sql语句的训练2024/9/9

1题 需要看清思路&#xff1a;不是将数据库中的device_id的名字改为user_infors_example&#xff0c;而是在查找的时候&#xff0c;需要将device_id看成user_infors_example来进行查找。 答案 select device_id AS user_infos_example FROM user_profile limit 2 2 当固定查找…...

【QT】常用控件-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;QComboBox&#x1f449;&#x1f3fb; QSpinBox&#x1f449;&#x1f3fb;QDateTimeEdit&#x1f449;&#x1f3fb;QD…...

828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统

828华为云征文&#xff5c;华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&a…...

25虾皮笔试shopee笔试测评sea笔试测评题型

虾皮笔试shopee笔试测评用的自己的笔试系统&#xff0c;全英文笔试&#xff1a; 1.Numerical Reasoning Test&#xff1a;10题&#xff0c;言语推断和数学计算 2. Verbal Reasoning Test&#xff1a;10题&#xff0c;言语理解&#xff0c;每题一段英文材料&#xff0c;选对错…...

启明云端乐鑫代理商,乐鑫ESP32无线芯片方案,物联网设备WiFi联动控制

随着智能和远程技术的飞速发展&#xff0c;物联网(IoT)逐渐出现在我们生活的每一个角落。乐鑫以其创新的无线通信技术&#xff0c;正成为智能家居、工业自动化和医疗设备等领域的推动者。 无线WiFi芯片模组不仅提供了强大的数据处理能力&#xff0c;还赋予了设备以直观的交互方…...

希尔排序/选择排序

前言&#xff1a; 本篇主要对常见的排序算法进行简要分析&#xff0c;代码中均以数组 arr[] { 5, 3, 9, 6, 2, 4, 7, 1, 8 } 为例&#xff0c;进行升序排列。 常见的排序算法有如下&#xff1a; 选择排序中&#xff0c;直接选择排序没有任何实际与教育意义&#xff0c;而堆排…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...