QT修仙笔记 事件大圆满 闹钟大成
学习笔记
牛客刷题
闹钟

时钟显示 通过
QTimer每秒更新一次QLCDNumber显示的当前时间,格式为hh:mm:ss,实现实时时钟显示。闹钟设置
- 使用
QDateTimeEdit让用户设置闹钟时间,可通过日历选择日期,设置范围为当前时间到未来 10 天。
- 提醒功能
- 语音播报:当到达设定的闹钟时间,从
QPlainTextEdit获取文本,利用QTextToSpeech进行语音播报。- 音效播放:同时,使用
QMediaPlayer播放指定的提醒音效文件123.mp3,音量设为 80。
- 控制操作
- 启动闹钟:点击“启动”按钮,开启定时器进行时间检查,此时“启动”按钮禁用,“停止”按钮启用。
- 停止闹钟:点击“停止”按钮,停止定时器和音效播放,“启动”按钮重新启用,“停止”按钮禁用。
#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
- 函数名:
bool QObject::event(QEvent *e) - 函数功能:这是Qt事件处理的入口函数。当一个事件发生时,首先会调用该函数。它会根据传入的事件对象
e,识别事件类型,然后进行初步处理或分发到更具体的事件处理函数。比如,它可以判断事件是鼠标事件、键盘事件还是其他类型事件,进而决定后续处理流程。 - 函数参数:
QEvent *e,这是一个指向QEvent对象的指针。QEvent是所有事件类的基类,通过它可以获取事件的详细信息,如事件类型、发生时间等。 - 函数返回值:
bool类型。如果事件被成功处理,返回true;若未处理或需要进一步处理,则返回false。返回值会影响事件的后续传递,如果返回false,事件可能会继续向上传递给父对象处理。 - 主要函数举例:
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
- 函数名:
void QWidget::mousePressEvent(QMouseEvent *event) - 函数功能:当鼠标按键在部件上按下时被调用。常用于记录鼠标按下的位置,为后续的绘图、拖曳等操作做准备。
- 函数参数:
QMouseEvent *event,通过它可以获取鼠标事件的详细信息,包括按下的是哪个鼠标按键(如Qt::LeftButton、Qt::RightButton等),鼠标在部件上的位置(相对于部件的坐标pos())以及在屏幕上的全局坐标(globalPos())等。 - 函数返回值:
void,没有返回值,专注于处理鼠标按下事件的相关逻辑。 - 主要函数举例:
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
- 函数名:
void QWidget::mouseReleaseEvent(QMouseEvent *event) - 函数功能:在鼠标按键在部件上释放时被调用。常与
mousePressEvent配合使用,完成一些与鼠标操作相关的功能,比如在绘图应用中,鼠标按下时开始绘制,释放时结束绘制。 - 函数参数:
QMouseEvent *event,包含鼠标释放事件的详细信息,与mousePressEvent中的参数类似。 - 函数返回值:
void,没有返回值,主要用于处理鼠标释放后的相关操作。 - 主要函数举例:
class MyWidget : public QWidget {Q_OBJECTQPoint 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
- 函数名:
void QWidget::mouseDoubleClickEvent(QMouseEvent *event) - 函数功能:当鼠标在部件上双击时被调用。通常用于实现一些特殊的交互功能,如双击打开文件、放大视图等。
- 函数参数:
QMouseEvent *event,可获取双击事件的相关信息,如双击的位置、按键等。 - 函数返回值:
void,没有返回值,用于执行双击事件对应的操作。 - 主要函数举例:
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
- 函数名:
void QWidget::mouseMoveEvent(QMouseEvent *event) - 函数功能:当鼠标在部件上移动时被调用。常用于实现实时响应鼠标移动的功能,如在绘图软件中实时绘制线条,或在游戏中根据鼠标移动控制角色方向。
- 函数参数:
QMouseEvent *event,通过它可以获取鼠标移动的详细信息,包括当前鼠标位置(pos())、移动过程中按下的按键(buttons())等。 - 函数返回值:
void,没有返回值,专注于处理鼠标移动相关逻辑。 - 主要函数举例:
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
- 函数名:
void QWidget::keyPressEvent(QKeyEvent *event) - 函数功能:在键盘按键被按下时被调用。常用于实现各种键盘控制功能,如在游戏中通过键盘控制角色移动,在文本编辑器中处理按键输入等。
- 函数参数:
QKeyEvent *event,通过它可以获取按下按键的详细信息,如按键的键值(key(),用于识别具体按键)、本次事件中使用的键的个数(count())以及键上的文本内容(text())等。 - 函数返回值:
void,没有返回值,主要用于执行键盘按下事件对应的操作。 - 主要函数举例:
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
- 函数名:
void QWidget::keyReleaseEvent(QKeyEvent *event) - 函数功能:当键盘按键被释放时被调用。可用于处理与按键释放相关的逻辑,如在一些需要长按按键触发特殊功能的场景中,按键释放时结束该功能。
- 函数参数:
QKeyEvent *event,包含按键释放事件的详细信息,与keyPressEvent中的参数类似。 - 函数返回值:
void,没有返回值,专注于处理按键释放后的操作。 - 主要函数举例:
class MyWidget : public QWidget {Q_OBJECTbool 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类通过keyPressEvent和keyReleaseEvent函数记录Ctrl键的按下和释放状态,并在Ctrl键释放时输出相应信息。
四、QWidget的定时器事件处理函数
- 函数名:
void QWidget::timerEvent(QTimerEvent *event) - 函数功能:当定时器超时时被调用。在基于事件处理函数版本的定时器实现中,通过重写该函数来定义定时器超时后执行的操作,比如定时更新界面显示的时间、定时检查网络连接状态等。
- 函数参数:
QTimerEvent *event,通过它可以获取定时器的相关信息,如定时器的ID号(timerId()),用于区分不同的定时器(当存在多个定时器时)。 - 函数返回值:
void,没有返回值,主要用于执行定时器超时后的操作。 - 主要函数举例:
class MyWidget : public QWidget {Q_OBJECTint 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的绘制事件处理函数
- 函数名:
void QWidget::paintEvent(QPaintEvent *event) - 函数功能:用于处理绘制事件,当窗口需要重新绘制时(如窗口大小改变、最小化后恢复、主动调用
repaint或update函数等情况),该函数会被自动调用。通常在这个函数中使用QPainter类进行各种图形绘制操作,如绘制文本、矩形、椭圆等。 - 函数参数:
QPaintEvent *event,包含了绘制事件的相关信息,虽然在实际绘制操作中可能较少直接使用,但它是绘制事件的标识。 - 函数返回值:
void,主要负责执行绘制操作,没有返回值。 - 主要函数举例:
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在窗口中绘制了文本和矩形。
牛客试炼
相关文章:
QT修仙笔记 事件大圆满 闹钟大成
学习笔记 牛客刷题 闹钟 时钟显示 通过 QTimer 每秒更新一次 QLCDNumber 显示的当前时间,格式为 hh:mm:ss,实现实时时钟显示。 闹钟设置 使用 QDateTimeEdit 让用户设置闹钟时间,可通过日历选择日期,设置范围为当前时间到未来 …...
变相提高大模型上下文长度-RAG文档压缩-1.常识
前言 之前遇到一个问题,公司大模型的长度不长,而且业务需要RAG返回不少的相关内容。通常RAG都是取top-10/15,文档由于长度限制不能太多,加上embedding效果不佳,返回的文档不多也不能保证都相关。 我们考虑到返回的文…...
人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略
一、引言 1.1 研究背景与意义 近年来,人工智能技术发展迅猛,已成为全球科技领域的焦点。从图像识别、语音识别到自然语言处理,从智能家居、智能交通到智能医疗,人工智能技术的应用几乎涵盖了我们生活的方方面面,给人…...
2025 年 2 月 TIOBE 指数
2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…...
防火墙是什么?详解网络安全的关键守护者
当今信息化时代,企业和个人在享受数字生活带来的便利时,也不可避免地面对各种潜在的风险。防火墙作为网络安全体系中的核心组件,就像一道牢不可破的防线,保护着我们的数据和隐私不受外界威胁的侵害。那么防火墙是什么?…...
【Elasticsearch】cumulative_cardinality
1.定义与用途 cumulative_cardinality是一种父级管道聚合(Parent Pipeline Aggregation),用于在父级直方图(histogram)或日期直方图(date_histogram)聚合中计算累计基数。它主要用于统计在某个…...
【LeetCode 刷题】贪心算法(2)-进阶
此博客为《代码随想录》贪心算法章节的学习笔记,主要内容为贪心算法进阶的相关题目解析。 文章目录 135. 分发糖果406. 根据身高重建队列134. 加油站968. 监控二叉树 135. 分发糖果 题目链接 class Solution:def candy(self, ratings: List[int]) -> int:n l…...
字体文件子集化(Font Subsetting)及实现代码
字体文件子集化(Font Subsetting)是指从一个完整的字体文件中提取出仅包含特定字符集的子集,以减小字体文件的大小。这在网页设计、移动应用开发和嵌入式系统中非常有用,可以显著减少加载时间和资源占用。 1. 字体子集化的基本原…...
第三篇:半导体“红蓝药丸“——IGBT/SiC器件如何重塑电驱系统
副标题:当黑客帝国遇见800V高压架构,第三代半导体开启能源革命 ▶ 开篇:红蓝药丸的终极抉择 黑客帝国隐喻 - 红色药丸(IGBT) :传统硅基器件构建的"真实世界"——成熟稳定但存在性能天花板…...
3.矩阵分解技术在推荐系统中的应用
接下来我们将深入探讨矩阵分解技术在推荐系统中的应用。矩阵分解是一种强大的技术,可以有效地处理数据稀疏性问题,并提高推荐系统的性能。在这一课中,我们将介绍以下内容: 矩阵分解的基本概念奇异值分解(SVDÿ…...
VTK编程指南<十六>:VTK表面重建之Delaunay三角剖分
1、无边界限制 三角剖分是一种应用非常广泛的重建技术。三角剖分将一些散乱的点云数据划分为一系列的三角形网格。最常用的三角剖分技术是Delaunay三角剖分。Delaunay三角剖分具有许多优良的性质,即最大化最小角特性,即所有可能的三角形剖分中࿰…...
2.Excel:滨海市重点中学的物理统考考试情况❗(15)
目录 NO12 1.数据透视表 2. 3.sum函数 4.sumifs客观/主观平均分 5.sumifs得分率 6.数字格式修改 NO3/4/5 sumifs某一组数据相加,某一范围,某一范围的具体点向下拖拉,锁定列;向左右,锁定行F4&#x…...
leetcode day17 二分查找 34+367 移除元素27
34 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为…...
ASP.NET Core SignalR的协议协商
SignalR支持多种服务器推送方式:Websocket、Server-Sent Events、长轮询。默认按顺序尝试。F12查看协商过程。websocket和HTTP是不同的协议,为什么能用同一个端口。在【开发人员工具】的【网络】页签中看WebSocket通信过程。 协议协商问题 集群中协议协…...
Hdoop之MapReduce的原理
简单版本 AppMaster: 整个Job任务的核心协调工具 MapTask: 主要用于Map任务的执行 ReduceTask: 主要用于Reduce任务的执行 一个任务提交Job --> AppMaster(项目经理)--> 根据切片的数量统计出需要多少个MapTask任务 --> 向ResourceManager(Yarn平台的老大)索要资源 --…...
JAVA并发编程3--多线程程序
1.创建线程的方法: 案例:计算1-1000的整数和 实现Runnable接口 步骤: 1.创建一个实现了Runnable接口的类 2.实现类去实现Runnable中的抽象方法:run() 3.创建实现类的对象 4.将此对象作为参数传递到Thread类的构造器中&#…...
自主项目面试点总结
1、许苑–OJ判题系统 技术栈:Spring BootSpring Cloud AlibabaRedisMybatisMQDocker 项目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice 1.1、项目介绍: 一个基于微服务的OJ系统,具备能够根据管理员预设的题目用例对用户提交的代…...
idea Ai工具通义灵码,Copilot我的使用方法以及比较
我用过多个idea Ai 编程工具,大约用了1年时间,来体会他们那个好用,以下只是针对我个人的一点分享,不一定对你适用 仅作参考。 介于篇幅原因我觉得能说上好用的 目前只有两个 一个是阿里的通义灵码和Copilot,我用它来干…...
4.python基础语法-下
文章目录 1.顺序语句2.条件语句 - if2.1什么是条件语句2.2语法格式2.2.1if2.2.2if - else2.2.3if - elif - else 2.3缩进和代码块2.4练习2.5空语句 pass 3.循环语句3.1while循环3.2for循环3.3continue3.4break 4.综合案例4.1设置初始属性4.2设置性别4.3设置出生点4.4针对每一岁…...
Java--集合(理论)
目录 一、collection collection常用方法 1.List(可以存在重复元素) 迭代器 迭代器的概念 注意事项 例子 1.ArrayList 特点 2.LinkedLIst 特点 3.Vector 特点 2.Set(无重复元素) 1.HashSet 特点 2.Linkedhashset&…...
3D图形学与可视化大屏: 3D 图形学的定义、应用领域和发展历程
一、3D 图形学的定义 3D 图形学是计算机科学的一个分支,主要研究如何在计算机上生成、处理和显示三维图形。它涉及到数学、物理学、计算机科学等多个学科领域,旨在通过计算机技术模拟真实世界中的三维物体和场景,为用户提供逼真的视觉体验。…...
Python 面向对象(类,对象,方法,属性,魔术方法)
前言:在讲面向对象之前,我们先将面向过程和面向对象进行一个简单的分析比较,这样我们可以更好的理解与区分,然后我们在详细的讲解面向对象的优势。 面向过程(Procedure-Oriented Programming,POP࿰…...
轮子项目--消息队列的实现(3)
上一篇文章中我把一些关键的类以及表示出来,如何对这些类对应的对象进行管理呢?管理分为硬盘和内存上,硬盘又分为数据库(管理交换机,队列和绑定)和文件(管理消息),本文就…...
5.7.1 软件项目管理范围、成本估算、风险分析
文章目录 管理范围成本估算风险分析 管理范围 软件项目管理范围包含4P,即人员、产品、过程、项目。人员管理通过人员能力成熟度模型PCMM进行管理。产品管理需要制定产品目标,识别产品的总体目标,而不涉及细枝末节。产品范围,识别产…...
Android新版高斯模糊(毛玻璃)官方实现,Kotlin
Android新版高斯模糊(毛玻璃)官方实现,Kotlin 从Android 12开始,Android官方API支持高斯模糊(毛玻璃)效果。关键是通过RenderEffect实现。 https://developer.android.com/reference/android/graphics/RenderEffecthttps://developer.android.com/refer…...
现代前端开发的演进与未来趋势:从工具革新到技术突破
在过去的十年中,前端开发经历了翻天覆地的变化。从最初的静态页面到如今复杂的单页应用(SPA),从手动操作 DOM 到基于虚拟 DOM 的高效渲染,从前端“三剑客”(HTML/CSS/JS)到全栈框架的兴起&#…...
数据结构与算法学习笔记----背包问题
数据结构与算法学习笔记----背包问题 author: 明月清了个风 first publish time: 2025.2.7 ps⭐️讲解了几种经典的背包问题:01背包,完全背包,多重背包及其变形,分组背包,讲解了他们的异同及对应的代码和优化方式&am…...
仿 RabbitMQ 实现的简易消息队列
文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道(通信通道)管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…...
吃瓜教程Day1笔记
主要内容: 1. 什么是机器学习以及 2. 机器学习的相关数学符号,为后续内容作铺垫,并未涉及复杂的算法理论, 因此阅读本章时只需耐心梳理清楚所有概念和数学符号即可。 3. “模型评估与选择” 是在模型产出以后进行的下游工作&…...
看盘细节系列 篇三:集合竞价的9点20分之前打到涨停/跌停,维持几分钟后,在9点20分之前撤单
文章目录 系列文章现象原因分析排除正常情况主力意图分析资金动向系列文章 看盘细节系列 篇一:集合竞价尾盘突变 看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单 现象 在股票交易的集合竞价阶段,在9点20分之前,股票的价格突然被大笔资金迅速拉高…...
