QT修仙笔记 事件大圆满 闹钟大成

学习笔记
牛客刷题

闹钟

在这里插入图片描述

  1. 时钟显示 通过 QTimer 每秒更新一次 QLCDNumber 显示的当前时间,格式为 hh:mm:ss,实现实时时钟显示。

  2. 闹钟设置

  • 使用 QDateTimeEdit 让用户设置闹钟时间,可通过日历选择日期,设置范围为当前时间到未来 10 天。
  1. 提醒功能
  • 语音播报:当到达设定的闹钟时间,从 QPlainTextEdit 获取文本,利用 QTextToSpeech 进行语音播报。
  • 音效播放:同时,使用 QMediaPlayer 播放指定的提醒音效文件 123.mp3,音量设为 80。
  1. 控制操作
  • 启动闹钟:点击“启动”按钮,开启定时器进行时间检查,此时“启动”按钮禁用,“停止”按钮启用。
  • 停止闹钟:点击“停止”按钮,停止定时器和音效播放,“启动”按钮重新启用,“停止”按钮禁用。
#include "widget.h"
#include "ui_widget.h"
#include<QTime>
#include<QDateTime>
#include<QTextToSpeech>
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建时钟
    timerTime=new QTimer(this);
    timerClock=new QTimer(this);
    //绑定时钟函数
    connect(timerTime,&QTimer::timeout,this,&Widget::timeSlot);
    connect(timerClock,&QTimer::timeout,this,&Widget::clockSlot);
    //时钟直接启动
    timerTime->start(1000);
    ui->timeLCD->setDigitCount(8);
    ui->dateTimeEdit->setCalendarPopup(true);
    ui->dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime());
    ui->dateTimeEdit->setMaximumDate(QDate::currentDate().addDays(10));
    ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
     speech=new QTextToSpeech(this);
     startSound=new QMediaPlayer(this);
       startSound->setMedia(QUrl("qrc:/new/prefix1/123.mp3"));
       startSound->setVolume(80);  //音量


}

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


void Widget::on_startBtn_clicked()
{

        //计时器启动
        this->timerClock->start(1000);
        ui->startBtn->setEnabled(false);
        ui->endBtn->setEnabled(true);

}

void Widget::on_endBtn_clicked()
{
// 取消
    this->timerClock->stop();
    startSound->stop();
    ui->startBtn->setEnabled(true);
    ui->endBtn->setEnabled(false);
}
//时钟增加函数
void Widget::timeSlot()
{
    QTime time;
    ui->timeLCD->display(time.currentTime().toString("hh:mm:ss"));
}
//闹钟函数
void Widget::clockSlot()
{

    QDateTime dt=ui->dateTimeEdit->dateTime();

//    QDateTime now;

    if(dt.secsTo(QDateTime::currentDateTime())==0){
        //播报
        QString text=ui->plainTextEdit->toPlainText();
        speech->say(text);
        ui->startBtn->setEnabled(true);

        timerClock->stop();
         startSound->play();

    }
}

学习笔记

一、QObject::event

  1. 函数名bool QObject::event(QEvent *e)
  2. 函数功能:这是Qt事件处理的入口函数。当一个事件发生时,首先会调用该函数。它会根据传入的事件对象e,识别事件类型,然后进行初步处理或分发到更具体的事件处理函数。比如,它可以判断事件是鼠标事件、键盘事件还是其他类型事件,进而决定后续处理流程。
  3. 函数参数QEvent *e,这是一个指向QEvent对象的指针。QEvent是所有事件类的基类,通过它可以获取事件的详细信息,如事件类型、发生时间等。
  4. 函数返回值bool类型。如果事件被成功处理,返回true;若未处理或需要进一步处理,则返回false。返回值会影响事件的后续传递,如果返回false,事件可能会继续向上传递给父对象处理。
  5. 主要函数举例
class MyObject : public QObject {
    Q_OBJECT
public:
    bool event(QEvent *e) override {
        if (e->type() == QEvent::MouseButtonPress) {
            qDebug() << "Mouse button pressed event caught in event()";
            return true;
        }
        return QObject::event(e);
    }
};

在这个例子中,MyObject类继承自QObject并重写了event函数。当检测到鼠标按下事件时,输出相应信息并返回true,表示事件已处理;否则,调用父类的event函数继续处理事件。

二、QWidget的鼠标事件处理函数

(一)mousePressEvent

  1. 函数名void QWidget::mousePressEvent(QMouseEvent *event)
  2. 函数功能:当鼠标按键在部件上按下时被调用。常用于记录鼠标按下的位置,为后续的绘图、拖曳等操作做准备。
  3. 函数参数QMouseEvent *event,通过它可以获取鼠标事件的详细信息,包括按下的是哪个鼠标按键(如Qt::LeftButtonQt::RightButton等),鼠标在部件上的位置(相对于部件的坐标pos())以及在屏幕上的全局坐标(globalPos())等。
  4. 函数返回值void,没有返回值,专注于处理鼠标按下事件的相关逻辑。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
public:
    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            qDebug() << "Left mouse button pressed at local position:" << event->pos();
        } else if (event->button() == Qt::RightButton) {
            qDebug() << "Right mouse button pressed at global position:" << event->globalPos();
        }
    }
};

在这个示例中,MyWidget类重写了mousePressEvent函数,根据按下的鼠标按键不同,输出相应的位置信息。

(二)mouseReleaseEvent

  1. 函数名void QWidget::mouseReleaseEvent(QMouseEvent *event)
  2. 函数功能:在鼠标按键在部件上释放时被调用。常与mousePressEvent配合使用,完成一些与鼠标操作相关的功能,比如在绘图应用中,鼠标按下时开始绘制,释放时结束绘制。
  3. 函数参数QMouseEvent *event,包含鼠标释放事件的详细信息,与mousePressEvent中的参数类似。
  4. 函数返回值void,没有返回值,主要用于处理鼠标释放后的相关操作。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
    QPoint pressPos;
public:
    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            pressPos = event->pos();
        }
    }
    void mouseReleaseEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            QPoint releasePos = event->pos();
            int distance = (releasePos - pressPos).manhattanLength();
            qDebug() << "Mouse dragged for a distance of:" << distance;
        }
    }
};

此例中,MyWidget类在mousePressEvent中记录鼠标按下的位置,在mouseReleaseEvent中计算鼠标拖动的距离并输出。

(三)mouseDoubleClickEvent

  1. 函数名void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
  2. 函数功能:当鼠标在部件上双击时被调用。通常用于实现一些特殊的交互功能,如双击打开文件、放大视图等。
  3. 函数参数QMouseEvent *event,可获取双击事件的相关信息,如双击的位置、按键等。
  4. 函数返回值void,没有返回值,用于执行双击事件对应的操作。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
public:
    void mouseDoubleClickEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            qDebug() << "Left mouse button double - clicked at:" << event->pos();
        }
    }
};

在这个示例中,当鼠标左键在MyWidget上双击时,输出双击的位置信息。

(四)mouseMoveEvent

  1. 函数名void QWidget::mouseMoveEvent(QMouseEvent *event)
  2. 函数功能:当鼠标在部件上移动时被调用。常用于实现实时响应鼠标移动的功能,如在绘图软件中实时绘制线条,或在游戏中根据鼠标移动控制角色方向。
  3. 函数参数QMouseEvent *event,通过它可以获取鼠标移动的详细信息,包括当前鼠标位置(pos())、移动过程中按下的按键(buttons())等。
  4. 函数返回值void,没有返回值,专注于处理鼠标移动相关逻辑。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
public:
    void mouseMoveEvent(QMouseEvent *event) override {
        if (event->buttons() & Qt::LeftButton) {
            qDebug() << "Mouse is being dragged with left button at:" << event->pos();
        }
    }
};

在这个例子中,当鼠标左键被按下并移动时,输出鼠标的当前位置信息。

三、QWidget的键盘事件处理函数

(一)keyPressEvent

  1. 函数名void QWidget::keyPressEvent(QKeyEvent *event)
  2. 函数功能:在键盘按键被按下时被调用。常用于实现各种键盘控制功能,如在游戏中通过键盘控制角色移动,在文本编辑器中处理按键输入等。
  3. 函数参数QKeyEvent *event,通过它可以获取按下按键的详细信息,如按键的键值(key(),用于识别具体按键)、本次事件中使用的键的个数(count())以及键上的文本内容(text())等。
  4. 函数返回值void,没有返回值,主要用于执行键盘按下事件对应的操作。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
public:
    void keyPressEvent(QKeyEvent *event) override {
        if (event->key() == Qt::Key_A) {
            qDebug() << "The 'A' key was pressed";
        } else if (event->key() == Qt::Key_Up) {
            qDebug() << "The up arrow key was pressed";
        }
    }
};

在此例中,MyWidget类重写了keyPressEvent函数,根据按下的不同按键输出相应信息。

(二)keyReleaseEvent

  1. 函数名void QWidget::keyReleaseEvent(QKeyEvent *event)
  2. 函数功能:当键盘按键被释放时被调用。可用于处理与按键释放相关的逻辑,如在一些需要长按按键触发特殊功能的场景中,按键释放时结束该功能。
  3. 函数参数QKeyEvent *event,包含按键释放事件的详细信息,与keyPressEvent中的参数类似。
  4. 函数返回值void,没有返回值,专注于处理按键释放后的操作。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
    bool isCtrlPressed = false;
public:
    void keyPressEvent(QKeyEvent *event) override {
        if (event->key() == Qt::Key_Control) {
            isCtrlPressed = true;
        }
    }
    void keyReleaseEvent(QKeyEvent *event) override {
        if (event->key() == Qt::Key_Control) {
            isCtrlPressed = false;
            qDebug() << "Ctrl key released";
        }
    }
};

在这个示例中,MyWidget类通过keyPressEventkeyReleaseEvent函数记录Ctrl键的按下和释放状态,并在Ctrl键释放时输出相应信息。

四、QWidget的定时器事件处理函数

  1. 函数名void QWidget::timerEvent(QTimerEvent *event)
  2. 函数功能:当定时器超时时被调用。在基于事件处理函数版本的定时器实现中,通过重写该函数来定义定时器超时后执行的操作,比如定时更新界面显示的时间、定时检查网络连接状态等。
  3. 函数参数QTimerEvent *event,通过它可以获取定时器的相关信息,如定时器的ID号(timerId()),用于区分不同的定时器(当存在多个定时器时)。
  4. 函数返回值void,没有返回值,主要用于执行定时器超时后的操作。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
    int timerId;
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        timerId = startTimer(1000); // 启动一个每秒触发一次的定时器
    }
    void timerEvent(QTimerEvent *event) override {
        if (event->timerId() == timerId) {
            qDebug() << "Timer timeout. Current time:" << QTime::currentTime();
        }
    }
};

在这个例子中,MyWidget类启动了一个定时器,并在timerEvent函数中处理定时器超时事件,输出当前时间。

五、QWidget的绘制事件处理函数

  1. 函数名void QWidget::paintEvent(QPaintEvent *event)
  2. 函数功能:用于处理绘制事件,当窗口需要重新绘制时(如窗口大小改变、最小化后恢复、主动调用repaintupdate函数等情况),该函数会被自动调用。通常在这个函数中使用QPainter类进行各种图形绘制操作,如绘制文本、矩形、椭圆等。
  3. 函数参数QPaintEvent *event,包含了绘制事件的相关信息,虽然在实际绘制操作中可能较少直接使用,但它是绘制事件的标识。
  4. 函数返回值void,主要负责执行绘制操作,没有返回值。
  5. 主要函数举例
class MyWidget : public QWidget {
    Q_OBJECT
public:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.setFont(QFont("Arial", 20));
        painter.drawText(rect(), Qt::AlignCenter, "Hello, Qt!");
        painter.drawRect(10, 10, width() - 20, height() - 20);
    }
};

在这个示例中,MyWidget类重写了paintEvent函数,使用QPainter在窗口中绘制了文本和矩形。

牛客试炼

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MapReduce到底是个啥?

在聊 MapReduce 之前不妨先看个例子&#xff1a;假设某短视频平台日活用户大约在7000万左右&#xff0c;若平均每一个用户产生3条行为日志&#xff1a;点赞、转发、收藏&#xff1b;这样就是两亿条行为日志&#xff0c;再假设每条日志大小为100个字节&#xff0c;那么一天就会产…

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动 1. 前情&#xff1a; 1TB的硬盘&#xff0c;分了120G作ubuntu22.04。/boot: 300MB, / : 40GB, /home: 75G, 其余作swap area。 2. 一开始按这个教程&#xff1a;对我无效 https://blog.csdn.net/Eric_xkk/article/details/1…

Redis 数据类型 List 列表

列表类型是⽤来存储多个有序的字符串&#xff0c;如下图所⽰&#xff0c;a、b、c、d、e 五个元素从左到右组成了⼀个有序的列表&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储 2^32 - 1个元素。在 Redis 中&#xff…

【devops】Macos 轻量化docker解决方案 orbstack | 不用Docker Desktop启动docker服务

一、orbstack OrbStack is the fast, light, and easy way to run Docker containers and Linux machines. It’s a supercharged WSL and Docker Desktop alternative, all in one easy-to-use app. 二、orbstack 的可视化

RabbitMQ消息队列 发送和接受

步骤 1: 安装 RabbitMQ 首先&#xff0c;需要安装 RabbitMQ&#xff0c;并确保它在运行中。 下载erlang语言包OTP。官网地址&#xff1a;Downloads - Erlang/OTP Rabbitmq官网下载地址&#xff1a;Downloading and Installing RabbitMQ — RabbitMQ 安装MQ注意事项&#xf…

2025最新版Node.js下载安装~保姆级教程

1. node中文官网地址&#xff1a;http://nodejs.cn/download/ 2.打开node官网下载压缩包&#xff1a; 根据操作系统不同选择不同版本&#xff08;win7系统建议安装v12.x&#xff09; 我这里选择最新版win 64位 3.安装node ①点击对话框中的“Next”&#xff0c;勾选同意后点…

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中&#xff0c;引入了一个全新的 MockMvcTester 类&#xff0c;使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性&#xff0c;分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…

WEB攻防-文件下载文件读取文件删除目录遍历目录穿越

目录 一、文件下载漏洞 1.1 文件下载案例&#xff08;黑盒角度&#xff09; 1.2 文件读取案例&#xff08;黑盒角度&#xff09; 二、文件删除 三、目录遍历与目录穿越 四、审计分析-文件下载漏洞-XHCMS 五、审计分析-文件读取漏洞-MetInfo-函数搜索 六、审计分析-…

01.Docker 概述

Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…

IDEA中常见问题汇总

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现

代码下载&#xff1a;私信博主回复基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现 《基于蜘蛛蜂优化算法的无人机集群三维路径规划》 摘要 本研究针对无人机集群三维路径规划问题&#xff0c;提出了一种基于蜘蛛蜂优化算法的解决方案。以5个无人机构成的集群为研究对…

路由过滤方法与常用工具

路由过滤 定义&#xff1a;路由器在发布或者接收消息时&#xff0c;可能需要对路由信息进行过滤。 作用&#xff1a;控制路由的传播与生成&#xff1b;节省设备和链路资源消耗&#xff0c;保护网络安全。 举例&#xff1a;学习汇总后的路由&#xff0c;而不学习汇总时的明细路由…

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道&#xff08;通信通道&#xff09;管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…

【天梯赛】L1-104 九宫格(C++)

易忽略的错误&#xff1a;开始习惯性地看到n就以为是n*n数组了&#xff0c;实际上应该是9*9的固定大小数组&#xff0c;查了半天没查出来 题面 L1-104 九宫格 - 团体程序设计天梯赛-练习集 代码实现 #include<bits/stdc.h> using namespace std; //易错&#xff1a;开…

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层 1. 两个元素实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</titl…

【转载】开源鸿蒙OpenHarmony社区运营报告(2025年1月)

●截至2025年1月31日&#xff0c;开放原子开源鸿蒙&#xff08;OpenAtom OpenHarmony&#xff0c;简称“开源鸿蒙”或“OpenHarmony”&#xff09;社区累计超过8200名贡献者&#xff0c;共63家成员单位&#xff0c;产生51.2万多个PR、2.9万多个Star、10.5万多个Fork、68个SIG。…

03:Spring之Web

一&#xff1a;Spring整合web环境 1&#xff1a;web的三大组件 Servlet&#xff1a;核心组件&#xff0c;负责处理请求和生成响应。 Filter&#xff1a;用于请求和响应的预处理和后处理&#xff0c;增强功能。 Listener&#xff1a;用于监听 Web 应用中的事件&#xff0c;实…

ASP.NET Core 如何使用 C# 向端点发出 POST 请求

使用 C#&#xff0c;将 JSON POST 到 REST API 端点&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要从端点获取数据&#xff0c;请参阅本文。 使用 . 将 JSON 数据发布到端点非常容易HttpClien…

大语言模型需要的可观测性数据的关联方式

可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及&#xff0c;可观测性&#xff08;Observability&#xff09;已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态&#xff0c;还…

渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…