【Qt】实现一个小闹钟

news2024/11/15 10:23:57

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>//按钮类
#include <QLineEdit>//行编辑器
#include <QLabel>//标签类
#include <QTextEdit>//输入框
#include <QTimerEvent>//定时器事件类
#include <QTimer>            //定时器类
#include <QTime>            //时间类
#include <QTimerEvent>       //定时器事件类
#include <QTextToSpeech>    //语音播报
#include <QMouseEvent>      //鼠标事件
#include <QMessageBox>      //提示框
#include <QObject>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void timerEvent(QTimerEvent *event)override;
    void mouseMoveEvent(QMouseEvent *event) override;//鼠标移动事件
    void mousePressEvent(QMouseEvent *event) override;//鼠标点击事件


public slots:
    void click_startBtn();
    void click_cancelBtn();


private:
    Ui::Widget *ui;

    QPushButton *startBtn;  //启动按钮
    QPushButton *cancelBtn; //取消按钮
    QLabel  *lab1;          //显示系统时间
    QLineEdit *lin1;        //时间输入框
    QTextEdit *tex1;        //输入框
    QTextToSpeech  *tts;    //语音播报
    QTimer t1;              //定义一个定时器变量
    QPoint temp;            //中间向量

    int tid = 0;            //输入时间时候使用

};
#endif // WIDGET_H

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->resize(500,400);//设置窗口大小
    this->setWindowFlag(Qt::FramelessWindowHint);//设置去除窗口标题


    //显示系统时间组件的一系列操作
    lab1 = new QLabel(this);
    lab1->resize(200,100);//设置大小
    lab1->setStyleSheet("background-color:pink;border-radius:10;font-size: 15pt;");
    lab1->move(20,20);//移动
    t1.start(1000);//启动一个定时器
    lab1->setAlignment(Qt::AlignCenter);//设置居中
    //显示系统时间的逻辑
    connect(&t1,&QTimer::timeout,[&](){
        lab1->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));

    });


    //对可编辑时间lin1组件的操作
    lin1 = new QLineEdit(this);
    lin1->resize(250,30);//设置大小
    lin1->move(lab1->x()+lab1->width()+10,lab1->y());//移动
    lin1->setPlaceholderText("请输入时间");//设置占位符

    //对启动按钮组件的操作
    startBtn = new QPushButton(this);
    startBtn->setText("启动");//设置默认文本
    startBtn->resize(100,50);//设置大小
    startBtn->move(lin1->x(),lin1->y()+lin1->height()+20);
    startBtn->setStyleSheet("background-color:rgb(128, 128, 128);border-radius:10;");
    connect(startBtn,&QPushButton::clicked,this,&Widget::click_startBtn);

    //对取消按钮组件进行操作
    cancelBtn = new QPushButton(this);//开辟空间
    cancelBtn->setText("取消");
    cancelBtn->resize(100,50);
    cancelBtn->move(startBtn->x()+startBtn->width()+50,startBtn->y());
    cancelBtn->setStyleSheet("background-color:rgb(128, 128, 128);border-radius:10;");
    connect(cancelBtn,&QPushButton::clicked,this,&Widget::click_cancelBtn);

    //对语音框组件进行操作
    tex1 = new QTextEdit(this);
    tex1->resize(500,400);
    tex1->move(0,150);
    tex1->setPlaceholderText("请输入你要朗读的内容");

    tts = new QTextToSpeech();
}
//启动逻辑槽函数
void Widget::click_startBtn()
{
    //启动定时器
    tid = this->startTimer(1000);
    lin1->setReadOnly(true);//禁用
    tex1->setReadOnly(true);//禁用
    qDebug()<<"启动成功";
}
//取消逻辑槽函数
void Widget::click_cancelBtn()
{
    int res = QMessageBox::information(this,
                                        "取消",
                                        "确定要取消嘛?",
                                         QMessageBox::Yes|QMessageBox::No,
                                        QMessageBox::No);

    if(res == QMessageBox::Yes)
    {
        this->killTimer(tid);//关闭定时器
        lin1->setReadOnly(false);//解除禁用
        tex1->setReadOnly(false);//解除禁用
        qDebug()<<"取消成功";
    }

}

//定时器处理函数
void Widget::timerEvent(QTimerEvent *event)
{
    QString text = lab1->text();
    if(event->timerId() == tid)
    {
        //如果两者相等就语音语音播报
        if(lin1->text() == lab1->text())
        {
            tts->say(tex1->toPlainText());
            qDebug()<<"语音播报成功";
        }
    }

}
//鼠标移动事件
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();
    }
}

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

效果展示:

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

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

相关文章

【Java】SpringCloud中使用set方法报错空指针

前言&#xff1a;今天在交流群中看见了一个空指针报错&#xff0c;想着哪里为空点过去看看为什么赋不上值就行&#xff0c;没想到啪啪打脸了&#xff0c;今天总结一下。 以下是他的RedisTempate注入和方法 可以看到&#xff0c;89行报错空指针。先分析一下&#xff0c; ①赋值…

机器学习:opencv--图像旋转、模版匹配多项

目录 一、图像旋转 1.numpy方法 2.opencv方法 二、模版匹配多项 1.完整代码 2.步骤解析 3.结果 三、图像旋转模版匹配 一、图像旋转 图像旋转有两种方式 1.numpy方法 import cv2 import numpy as npimg cv2.imread(suda.jpg) img cv2.resize(img, (300, 300))# np…

解决Windows Server 2012加密套件过时的问题

给自己网站加了SSL证书后&#xff0c;发现在360极速浏览器浏览时&#xff0c;会显示加密套件已经过时。一直以为是.cn域名的问题&#xff0c;后面才发现是IIS上面加密套件过时的问题。 TLS/SSL (Schannel SSP) 中的密码套件 - Win32 apps | Microsoft Learn 一开始我以为切换到…

力扣518-零钱兑换 II(Java详细题解)

题目链接&#xff1a;518. 零钱兑换 II - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完背包&#xff0c;所以现在的题解都是以背包问题为基础再来写的。 如果大家不懂背包问题的话&am…

【重点】抓取三次握手的数据报文,分析每次握手的交互过程

1、制造三次握手的报文 三次握手是TCP&#xff08;传输控制协议&#xff09;建立连接的过程。它包括以下三个步骤&#xff1a; 1&#xff09;SYN&#xff08;同步&#xff09;&#xff1a;客户端发送一个SYN报文&#xff0c;请求与服务器建立连接。 2&#xff09;SYN-ACK&am…

text2video的step1出错,与纠正

也就是配置RWKV向外提供API访问权;并将openai的api_base改为本地访问地址。 # 设置 OpenAI 的 API 密钥 openai.api_key = "free"#os.getenv(OPENAI_API_KEY) #老版本,过时了,1.2已经不支持了 openai.api_base = "http://127.0.0.1:8000/v1" #在这里设置…

Java入门:08.Java中的static关键字

1 static关键字 可以修饰属性变量&#xff0c;方法和代码段 static修饰的属性称为静态属性或类属性&#xff0c; 在类加载时就在方法区为属性开辟存储空间&#xff0c;无论创建多少个对象&#xff0c;静态属性在内存中只有一份。 可以使用 类名.静态属性 的方式引用 static修饰…

图的基础概念

图和树一样&#xff0c;是一种十分重要的算法思想&#xff0c;是很多算法比如floyd算法&#xff0c;Dijkstra算法等的实现基础 一、节点和边 节点和边是图的基本组成部分&#xff0c;以公交路线图为例&#xff0c;每一个站点相当与图的节点&#xff0c;连接每一个站点的路线相…

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层 1.4输出层1.4.1softmax层 1.5损失函数1.6反向传播 2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09;2.4激活函数&…

卷轴模式系统源码开发在当今时代的多重益处

随着信息技术的飞速发展&#xff0c;数字化转型已成为各行各业不可逆转的趋势。在这一背景下&#xff0c;卷轴模式系统&#xff08;这里的“卷轴模式”可理解为一种以滚动、分层或模块化展示信息的界面设计方式&#xff0c;类似于古代卷轴展开的过程&#xff0c;但更多地是指其…

2024金砖展 | 蓝卓:“1+2+N”智能企业新架构,赋能全球工业数字化转型

2024金砖国家新工业革命展——工业互联网专题展览作为2024金砖国家新工业革命展聚焦工业互联网的专题展示区域&#xff0c;全面展示工业互联网新技术、新产品、新方案、新应用、新项目、新生态等。 展览时间&#xff1a;2024年9月8日-9月11日 展览地点&#xff1a;厦门国际会展…

FreeRTOS学习记录——持续更新

目录 入门知识&#xff1a; 裸机与FreeRTOS: 裸机&#xff1a; RTOS系统&#xff1a; 基础知识: 任务调度&#xff1a; 分类&#xff1a; 时间片调度&#xff1a; 任务状态&#xff08;四种&#xff09;&#xff1a; 四种状态图片&#xff1a; 入门知识&#xff1a; …

AV1 Bitstream Decoding Process Specification:术语和定义

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

上海市皮肤病医院引入AcrelEMS-MED平台打造绿色医院

在数字化转型的浪潮中&#xff0c;上海市皮肤病医院再次走在前列&#xff0c;宣布对其能源管理系统进行全面升级&#xff0c;引入AcrelEMS-MED医院能源管理平台&#xff0c;以科技力量推动绿色医院建设&#xff0c;为患者和医护人员打造更加安全、高效、环保的就医与工作环境。…

2024.9.9(极客大挑战 2019]EasySQL,[极客大挑战 2019]Knife)

题目一&#xff1a;极客大挑战 2019]EasySQL 1、点开题目链接&#xff0c;来到下面的界面 2、遇到这样的登录界面&#xff0c;先尝试admin和万能密码&#xff08;1 or 11#&#xff09;&#xff0c;拿到flag 题目二&#xff1a;[极客大挑战 2019]Knife 1、点开链接&#xff0c…

【C++】模板:进阶(仿函数深度剖析)

目录 一.仿函数的概念 二.仿函数的作用 三.模板的非类型模板参数 四.array 五.模板的特化 六.函数模板 七.类模板 1.全特化 2.偏特化 八.模板分离编译 一.仿函数的概念 仿函数本质就是一个类&#xff0c;此类中重载了运算() &#xff0c;因此它使用起来就和函数很像&a…

新160个crackme - 053-devilz KeyGen me#3

运行分析 解压出来4个文件运行程序发现要破解Name和Serial PE分析 32位&#xff0c;petite壳 手动脱壳 使用windows XP虚拟机OD打开程序按2下F8&#xff0c;发现ESP变红&#xff0c;根据ESP定律&#xff0c;在该地址右键 -> HW break下断点 继续按2下F9&#xff0c;来到灰色…

从0到1:中小企业如何用内容营销吸引客户,塑造品牌魅力?

今天咱们来聊聊中小企业如何通过内容营销这把“金钥匙”&#xff0c;打开客户的心门&#xff0c;同时塑造出独特的品牌魅力。别紧张&#xff0c;这其实就是一场精彩的交流盛宴&#xff0c;让我们一起探索其中的奥秘吧&#xff01; 一、内容营销&#xff1a;真诚对话的开始 想象…

OAuth 2.0 授权流程详解与 FastAPI 实现

在现代网络应用中&#xff0c;OAuth 2.0 已成为授权和认证的标准协议。它允许用户将访问权限授予第三方应用&#xff0c;而无需暴露自己的用户名和密码。本文将详细介绍 OAuth 2.0 的常见授权流程&#xff0c;并展示如何在 FastAPI 中实现这些流程。 OAuth 2.0 简介 OAuth 2…

数字化转型不是终点,数字技术服务平台如何陪伴企业持续进化?

数字化转型确实不是终点&#xff0c;而是一个持续的过程&#xff0c;它要求企业不断适应变化、优化流程、创新业务模式。数字技术服务平台在陪伴企业持续进化方面扮演着至关重要的角色&#xff0c;具体体现在以下几个方面&#xff1a; 灵活性与可扩展性&#xff1a;数字技术服…