[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器
目录
前言:Qt与操作系统的关系
一、Qt事件
1.事件介绍
2.事件的表现形式
常见的Qt事件:
常见的事件描述:
3.事件的处理方式
处理鼠标进入和离开事件案例
控件添加到对象树底层原理
二、鼠标事件
1.鼠标按下和释放事件(单击)
2.鼠标双击事件
3.鼠标移动事件
4.鼠标滚轮滚动事件
三、键盘事件
1.键盘按下单个按键事件
2.组合键按下事件
四、定时器事件
使用说明
Demo:设置倒计时程序
五、窗口相关事件
1.窗口移动事件
2.窗口大小改变事件
六、事件分发器与事件过滤器
前言:Qt与操作系统的关系
Qt与操作系统的关系,虽然说Qt是一个跨平台的C++开发框架,但是Qt的很多能力其实都是操作系统提供的,而且Qt应用程序也是运行在操作系统上的,也需要操作系统的支持。只不过是Qt封装了系统调用的API而已,不同平台下封装不同的系统调用,实现了跨平台的能力。
对于事件、文件操作、多线程编程、网络编程等模块的编程下,Qt也是无法独立完成的,一定是需要操作系统的支持,所以Qt的很多业务实现都需要操作系统提供很多的帮助。
一、Qt事件
1.事件介绍
对于信号槽来说,用户进行的各种操作都可能会产生信号,可以给信号绑定槽函数,那么当信号触发的时候,就会自动的调用执行对应的槽函数了。事件和信号槽很相似,用户进行各种操作的时候,也会产生事件,同样可以给事件关联上处理函数或者说处理逻辑,当事件触发的时候,就能够执行对应的函数/逻辑了。
信号槽机制是Qt的机制,而事件是操作系统的概念,Qt同样把操作系统的事件机制进行了封装,就变成了Qt的事件机制,而信号槽机制其实也就是Qt事件的更一步的封装机制。在实际开发当中绝大多数的情况,都是使用Qt的信号槽机制进行交互的。
但是会有一些特殊情况,可能用户的一些行为操作,Qt中没有提供对的信号,也就没法关联信号槽了,此时就需要通过重写事件处理函数的形式,来手动处理事件的相应逻辑了。所以说事件机制可以让程序员根据实际的需求,更加深度化的去定制用户操作对应的处理逻辑了。
2.事件的表现形式
Qt中的是使用一个对象来表示一个事件的,所有的Qt事件类都是继承于QEvent抽象类。事件的发出是通过操作系统或者Qt平台本身在代码逻辑下发出的。一些事件是由用户操作后发出,例如按下键盘,按下鼠标等。还有一些事件是由程序或系统本身发出的,例如定时器事件等。
常见的Qt事件:
对于不同的事件关注的点是不一样的,所以说类内部的实现提供的接口方法也是不一样的。
常见的事件描述:
事件 | 说明 |
鼠标事件 | 鼠标左键、鼠标右键等各种按键、鼠标滚轮、鼠标移动、按键的按下和松开 |
键盘事件 | 按键类型、按键按下和松开 |
定时器事件 | 定时事件到达 |
进入离开事件 | 鼠标进入和离开区域 |
滚轮事件 | 鼠标滚轮滚动 |
绘屏事件 | 重绘屏幕的某些部分 |
显示隐藏事件 | 窗口的显示和隐藏 |
移动事件 | 窗口位置的变化 |
窗口事件 | 是否为当前窗口 |
大小改变事件 | 窗口大小改变 |
焦点事件 | 键盘焦点的移动 |
3.事件的处理方式
对于信号来说是定义槽函数并和信号进行关联,而事件的处理不太一样,需要重写该事件的处理函数来实现事件的处理。具体是使用多态的机制,创建子类,继承要监控的父类,在子类中重写事件处理函数,后续事件触发的时候,就会通过多态的机制,执行到重写的子类事件执行函数了。
为什么非要创建子类,在子类中重写事件处理函数呢?因为对于每个控件的相同事件有着不同的处理逻辑,所以需要为每一个控件定制他自己独有的处理方法,当然所有控件用一个也是可以的,直接在QWidget类中重写事件处理函数就可以了,这样就会使所有的控件同一事件的处理操作一样了。
处理鼠标进入和离开事件案例
首先创建子类,然后再子类中定义上图中的两个事件处理函数,enterEvent是鼠标进入事件,leaveEvent是鼠标离开事件。之后可以代码中创建我们的子类控件,也就是创建一个父类指针指向子类的对象,然后鼠标进入和离开通过多态机制,就会执行子类重写的函数了。
也可以通过ui界面的方式,我们拖拽一个父类控件,然后把控件提升为一个子类控件,同时设置该控件的父类即可。原理和上述类似,就是把标准控件变为了标准控件的自定义子类控件,会继承标准控件的属性和功能。
控件添加到对象树底层原理
创建一个QPushButton之后,他会调用QPushButton的构造函数,QPushButton继承于QAbstractButton,所以会调用QAbstractButton的构造函数,QAbstractButton继承于QWidget,所以对调用QWidget的构造函数,会一直层层调用,直到调用的QObject的时候位置,他是所有类的基类,那么调用之后,parent参数也层层传递给了QObject类,通过参数的值来判断是否要添加到对象树,以及添加到什么位置上。
二、鼠标事件
Qt中的鼠标事件是由QMouseEvent类来实现的,当鼠标移动和操作都会产生鼠标事件。
1.鼠标按下和释放事件(单击)
鼠标按下事件处理函数是mousePressEvent,鼠标释放事件处理函数是mouseReleaseEvent他带了一个event参数,内部就带有了鼠标的各种属性,例如鼠标点击/释放的位置、哪个按键点击/释放的等等。
如何判断是操作的鼠标哪个键呢,Qt中提供了一些MouseButton枚举变量对应的就是鼠标的哪一个按键了。Qt::LeftButton左键、Qt::RightButton右键、Qt::MidButton鼠标滚轮按键。
对于mousePressEvent处理函数来说, 无论是鼠标的左键、右键、滚轮等等按键都能进行触发,但是对于一些游戏鼠标的特殊按键是不一定的,因为那些按键是通过特定的驱动程序转化为一些其他操作了,不一定是原生的鼠标点击操作。
对于QPushButton的clicked()信号就是对应的一次鼠标按下和一次鼠标释放事件。
void Label::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){qDebug() << "按下左键";}else if(event->button() == Qt::RightButton){qDebug() << "按下右键";}//当前ev对象,就包含了鼠标点击位置的坐标qDebug() << event->x() << ", " << event->y();//相对于屏幕左上角的坐标qDebug() << event->globalX() << ", " << event->globalY();
}void Label::mouseReleaseEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){qDebug() << "释放左键";}else if(event->button() == Qt::RightButton){qDebug() << "释放右键";}//当前ev对象,就包含了鼠标点击位置的坐标qDebug() << event->x() << ", " << event->y();//相对于屏幕左上角的坐标qDebug() << event->globalX() << ", " << event->globalY();
}
2.鼠标双击事件
鼠标双击事件的处理函数是mouseDoubleClickEvent函数,使用方法和上述单击的没什么区别。对于双击左键的事件间隔是跟随系统的,当鼠标双击的时候,单击事件也会触发,当第一次点击的时候就会触发单击操作,第二次点击的时候会触发双击操作,所以如果处理不好可以会出问题。
3.鼠标移动事件
鼠标移动的事件处理函数是mouseMoveEvent函数,所有的操作和上述也都是一样的,都是基于event参数进行的操作。但是我们实现完之后会发现,我们想在鼠标移动的时候打印鼠标所处的位置,却打印不出来,是为什么呢?
因为鼠标移动不同于鼠标点击操作,因为鼠标移动会产生大量的事件,在进行一些复杂的程序的时候,一直触发鼠标移动事件会降低程序的效率,所以说为了保证效率,默认是不会对鼠标的移动进行追踪,也就是说鼠标移动的时候不会调用鼠标移动处理函数。如何打开追踪呢?
void setMouseTracking(bool enable);
鼠标移动事件的追踪是有区域限制的,而且没有继承关系,如果说在QPushButton中设置的,那么QWidget的窗口是无法追踪的,如果在QWidegt窗口设置的,那么QPushButton是无法追踪的,但是这样的化QWidget也是无法追踪的,他会拦截事件。
4.鼠标滚轮滚动事件
鼠标滚轮滚动的事件处理函数是wheelEvent函数,他的参数不是QMouseEvent类型了,而是变成了一个QWheelEvent滚轮类。该类中保存了一个滚轮移动的距离,正数表示向前移动,负数表示向后移动,可以使用该类中的delta()函数来获取滚动的距离。
intQGraphicsSceneWheelEvent::delta() const;
三、键盘事件
Qt中的键盘事件是由QKeyEvent类来实现的,Qt中的QShortCut设置快捷键的类就是Qt信号槽机制封装过的一个用于获取键盘按键的一种方式。
键盘事件和鼠标事件最大的不同在于,键盘事件的触发,首先需要窗口获得焦点之后,才会触发对应的键盘事件。
1.键盘按下单个按键事件
键盘按下事件的处理函数是KeyPressEvent函数,函数中的参数就是键盘的各种属性内容,参数内部就包含了用户具体输入的内容了。 可以通过QKeyEvent类中的key函数获取到输入的内容。
当我们打印key的返回值的时候,会发现我们输入的内容都变成了一些数字,在Qt中把键盘的所有按键都用一个枚举变量Key定义成了各种值的数字。使用Qt::xxx便是键盘按键。
void Widget::keyPressEvent(QKeyEvent *event)
{// 获取键盘输入按键int key = event->key();//判断键盘是否输入的是按键Aif(key == Qt::Key_A){qDebug() << "按下了A键";}
}
上述的枚举值Key_A等是不会区分大小写的,键盘属于物理按键,而大小写属于的是字符的概念,通过检测键盘shift的状态来区分用户输入的大小写,而并非这些枚举变量值区分大小写。
2.组合键按下事件
按下组合键也是属于键盘输入事件,也是由keyPressEvent函数进行事件处理,对于组合键一般都是ctrl、shift、alt等等组合操作。Qt内置了对于键盘输入是否使用了组合键的判断,并不是直接判断,而是把上述的ctrl、shift、alt等按键定义为了修改键,并为这些修改键定义了在了Qt内部的KeyboardModifiter枚举变量中。同时在QKeyEvent类中提供了modifiers函数用来判断是否使用了修改键,并返回修改键的值。通过判断是否使用修改键加上普通键,就可以判断出来是否使用了组合键了。
Qt::KeyboardModifiers modifiers() const;
void Widget::keyPressEvent(QKeyEvent *event)
{// 获取用户输入内容int key = event->key();// 判断是否是ctrl + Aif(key == Qt::Key::Key_A && event->modifiers() == Qt::ControlModifier){qDebug() << "按下了组合键 ctrl + A";}
}
四、定时器事件
Qt中进行窗口程序的处理过程中,经常要周期性的执行某些操作,就需要用到定时器了,定时器会在一定时间间隔后,去执行某一个任务,这种机制在很多场景中都会用到。
使用说明
在Qt中定时器事件类是QTimerEvent类。定时器事件的触发是由定时器完成的,那么如何创建定时器呢?QObject类中提供了startTimer函数,会创建一个定时器对象,同时启动定时器并返回一个定时器的唯一标识符对象,后续就用该标识符操作定时器了。QObject类还提供了关闭定时器的函数killTimer,传递的就是定时器的标识符。
当定时器的计时到了一个周期之后,也就是到了设置的时间后,会触发定时器事件,timerEvent则是定时器定时器事件的处理函数,参数就是定时器事件。
int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer); // 启动定时器
void killTimer(int id); // 销毁定时器
还需要注意的一点是,定时器在一个窗口/类中可以创建多个,而这些定时器想要实现的操作是不一样的,但是都会调用同一个定时器事件处理函数,所以在触发定时器事件后,首先要获取定时器事件的内部存放的定时器标识符,然后用if-else来确定需要执行什么操作。
但是实际开发中一般都是使用封装好的QTimer类进行定时器的操作,当触发定时器事件的时候,会产生QTimer::timeout信号,之后绑定槽函数,实现定时器事件的处理会更方便一些。就不需要我们管理销毁定时器、以及区分是哪个定时器触发的事件了。
QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MyWidget::handleTimeout);timer->start(1000); // 启动定时器
Demo:设置倒计时程序
创建一个LCDNumber控件和一个定时器,设置定时时间为1s,事件到了就调用定时器事件处理函数,在函数内部操作LCDNumber控件的值-1,就实现了倒计时。
int timerId() const { return id; }
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置初始值ui->lcdNumber->display(10);//开启定时器_timerId = this->startTimer(1000);
}Widget::~Widget()
{delete ui;
}//定时器事件处理函数
void Widget::timerEvent(QTimerEvent *event)
{//获取触发定时器事件是哪一个定时器if(event->timerId() != this->_timerId){return;}int value = ui->lcdNumber->intValue();if(value <= 0){this->killTimer(this->_timerId);return;}ui->lcdNumber->display(value - 1);
}
五、窗口相关事件
1.窗口移动事件
窗口移动事件的的处理函数是moveEvent函数,会带有一个QMobeEvent类型的参数,该类内部最主要的接口就是oldPos和pos,分别代表的是旧的位置,和移动后的新位置。并返回QPoint类型的变量,内部就包含了x,y坐标系的值。
const QPoint& oldPos() coonst;
const QPoint& pos() const;
2.窗口大小改变事件
窗口大小改变事件的处理函数是resizeEvent函数,参数是QResizeEvent,和窗口移动事件类似,类内部最主要的函数就是oldSize和size表示原来的大小和改变后的窗口大小。返回一个QSize类型的参数,内部包含了长度和宽度等数值,和上面的QSize合起来就是窗口的geomeory属性。
const QSize& oldSize() coonst;
const QSize& size() const;
六、事件分发器与事件过滤器
事件分发和事件过滤也是属于Qt事件的机制之一,对于事件分发器来说,会重写一个event函数,会直接获取到所有的事件,并对这些事件在进行分发处理,但是这样很有很大的危险,如果说实现过程中某些逻辑不正确的化,可能会导致很多的事件无法处理,或者无法正确的处理,所以说还是推荐对每个事件单独重写事件处理函数,甚至说更推荐使用信号槽机制进行处理,除非Qt中没有对应的信号机制,在使用Qt的事件机制解决问题。
事件过滤会比事件分发好一些,事件过滤器对于特定的一些事件就行事件处理,不会涉及到所有事件的重写操作。但也不推荐使用,也不常见。如果说一个程序在特定场景或特定操作中需要禁用用户的某些操作,可以考虑使用事件过滤机制。
事件过滤器一般也是事件分发器使用的时候,搭配使用的一个机制,先过滤一些事件,然后再进行事件的分发处理。
相关文章:
[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器
目录 前言:Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件: 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件(单击&#x…...
从零开始:Gitee 仓库创建与 Git 配置指南
引言 Git 是一款广泛使用的版本控制工具,它能够帮助开发者在开发过程中高效地管理代码的版本。而 Gitee(码云)是国内知名的 Git 托管平台,它提供了强大的代码托管、团队协作和项目管理功能。如果你是 Git 和 Gitee 的新手&#x…...
大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。
1、项目背景:针对大文件上传,如果将文件作为一个请求去发送给后端,会有以下几种问题,首先是上传时间长,用户不能进行其他操作,包括页面刷新等操作,其次有的接口会设置响应时间限制,可…...
如何在日常工作中使用AI
### 如何在日常工作中使用AI:提高效率与创造力 随着人工智能(AI)技术的不断发展,它已经成为我们日常工作的重要助手。无论是在准备演示文稿、进行知识搜索还是寻求技术支持方面,AI都能够提供有力的支持。本文将探讨如何…...
计算机网络 (47)应用进程跨越网络的通信
前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程,它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信,本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信,需要借助网络协议栈中的各层协议&#x…...
医疗集群系统中基于超融合数据库架构的应用与前景探析
一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…...
2024年度推进可解释人工智能迈向类人智能讨论总结分享
目录 一、探索“可解释人工智能”:AI如何从“黑箱”走向“透明大师” 二、走进可解释人工智能:让AI的决策变得透明 (一)几种常见的特征导向方法 (二)像素级方法 1. 层次相关传播(LRP&#…...
【Unity】使用Canvas Group改变UI的透明度
目录 一、前言二、Canvas Group三、结合DOTween达到画面淡进的效果 一、前言 在平时开发中,可以通过控制材质、Color改变UI透明度,除此之外还可以CanvasGroup组件来控制透明度。 二、Canvas Group 官方文档链接👉👉 点击进入 …...
【北京迅为】iTOP-4412全能版使用手册-第八十七章 安装Android Studio
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...
小例Java结合Spring框架和MyBatis ORM来实现 ERP项目中实现读写分离
前记:大家带着挑剔的眼光,多多批判和指正!🙏 在ERP项目中实现读写分离,我们可以使用Java结合Spring框架和MyBatis ORM来实现。以下是一个简化的例子,展示了如何在ERP项目中配置和使用读写分离。 一、项目…...
.gitignore配置忽略out目录
文章目录 说明操作 说明 可以结合IDEA可视化操作git,只要不删除远程仓库,如果本地操作项目出现错误,可以直接修改远程仓库的.gitignore文件,并重新拉取项目到本地。 操作 在项目根目录下找到 .gitignore 文件,打开并…...
mac 安装mongodb
本文分享2种mac本地安装mongodb的方法,一种是通过homebrew安装,一种是通过tar包安装 homebrew安装 brew tap mongodb/brew brew upate brew install mongodb-community8.0tar包安装 安装mongodb 1.下载mongodb社区版的tar包 mongdb tar包下载地址 2…...
向harbor中上传镜像(向harbor上传image)
向 Harbor 中上传镜像通常分为以下几个步骤: 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先,确保你已经能够访问 Harbor,并且已经注册了账户。如果还没有 Harbor 账户,你需要先注册一…...
项目太大导致 git clone 失败
git克隆也分深浅,大项目clone可以先用浅克隆,只克隆源代码和最新的提交记录。 具体分两步: 1. 浅克隆 git clone https://github.com/google/mydemo.git --depth 1 只会克隆最新的一次提交,没有历史记录, 2. 拉取剩…...
开发神器之cursor
文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器,集成了先进的 AI 技术,旨在提升编程效率。以下是其主要特点和功能&a…...
Python爬虫学习前传 —— Python从安装到学会一站式服务
早上好啊,大佬们。我们的python基础内容的这一篇终于写好了,啪唧啪唧啪唧…… 说实话,这一篇确实写了很久,一方面是在忙其他几个专栏的内容,再加上生活学业上的事儿,确实精力有限,另一方面&…...
MySQL触发器:概念、作用
MySQL触发器:概念、作用与问题解决 在MySQL数据库管理系统中,触发器是一项强大且实用的功能。它为数据库的操作提供了一种自动化响应机制,在许多场景下极大地提升了数据管理的效率和数据的完整性。本文将深入探讨MySQL触发器是什么ÿ…...
ASP.NET Core 中基于 Cookie 的身份鉴权实现
在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…...
从玩具到工业控制--51单片机的跨界传奇【3】
在科技的浩瀚宇宙中,51 单片机就像一颗独特的星辰,散发着神秘而迷人的光芒。对于无数电子爱好者而言,点亮 51 单片机上的第一颗 LED 灯,不仅仅是一次简单的操作,更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...
Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数
目录 模版 先序遍历 中序遍历 后序遍历 力扣原题 相同的二叉树 力扣原题 翻转二叉树 遍历树的层数 题目 静态变量 核心逻辑 模版 // 二叉树public static class Node{public int value;public Node left;public Node right;public Node(int v) {valuev;}} 先序遍历 …...
麒麟操作系统服务架构保姆级教程(十二)keepalived高可用
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 随着业务的扩大,服务器集群也越来越大,用户多了起来就要保证用户访问,服务绝对不能宕机,那么这个时候咱们除了做灾备以外,负载均衡服务器会…...
docker 部署confluence
1.安装docker的过程就不说了。 2.下载镜像。 docker pull cptactionhank/atlassian-confluence:7.4.0 docker images 3.下载pojie 包。 https://download.csdn.net/download/liudongyang123/90285042https://download.csdn.net/download/liudongyang123/90285042 4.编写do…...
【English-Book】Go in Action目录页翻译中文
第8页 内容 前言 xi 序言 xiii 致谢 xiv 关于本书 xvi 关于封面插图 xix 1 介绍 Go 1 1.1 用 Go 解决现代编程挑战 2 开发速度 3 • 并发 3 • Go 的类型系统 5 内存管理 7 1.2 你好,Go 7 介绍 Go 玩具 8 1.3 总结 8 2 Go 快速入门 9 2.1 程序架构 10 2.2 主包 …...
奉加微PHY6230兼容性:部分手机不兼容
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输
前言 大家好,我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术,以保证图表的实时渲染,当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE? SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …...
HJ3 明明的随机数(Java版)
一、试题地址 明明的随机数_牛客题霸_牛客网 二、试题内容 描述 对于明明生成的 nn 个 11 到 500500 之间的随机整数,你需要帮助他完成以下任务: 删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;然后…...
C++ 模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
Linux-----线程同步(条件变量)
目录 相关API restrict关键字 线程间条件切换函数 条件变量pthread_cond_t 案例 在前面的锁的基础上进一步提高线程同步效率,也就是两个线程只用锁去执行的话依然会存在资源竞争的情况,也就是抢锁,这里就需要在锁的这边加上限制…...
58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1
进入靶场 和2次注入的页面很像 不过养成查看源代码的好习惯 先访问source.zip 下载后解压,发现两个文件 第一个文件夹打开又有4个PHP文件 那还是先看index.php文件好了 有PHP和HTML两部分,下面是PHP部分代码(HTML太长了,先放一…...
小汽车维修记录程序(PC版)
我需要一个小程序,记录我的小车保养相关的情况:时间,地点,某种零件,以什么价格被保养使用。这样我才能清楚的知道我的小车下一次保养,然后我可以有的放矢的去准备下一次的零件和时间,避免过度保…...
回顾2024年在CSDN的成长
文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN:编程新手的避风港初学者的福音:细致入微的知识讲解考试复习神器:技术总结的“救命指南”曾经的自己:为何迟迟不迈出写博客的第一步兴趣萌芽:从“读”到“想写”的初体验…...
AI编程工具使用技巧——通义灵码
活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…...
解读InnoDB数据库索引页与数据行的紧密关联
目录 一、快速走进索引页结构 (一)整体展示说明 (二)内容说明 File Header(文件头部) Page Header(页面头部) Infimum Supremum(最小记录和最大记录) …...
KubeSphere 与 Pig 微服务平台的整合与优化:全流程容器化部署实践
一、前言 近年来,为了满足越来越复杂的业务需求,我们从传统单体架构系统升级为微服务架构,就是把一个大型应用程序分割成可以独立部署的小型服务,每个服务之间都是松耦合的,通过 RPC 或者是 Rest 协议来进行通信,可以按照业务领域来划分成独立的单元。但是微服务系统相对…...
虚幻基础2:gameplay框架
能帮到你的话,就给个赞吧 😘 文章目录 ue框架:gameplay组成game modeactorcomponent player controllergame state 工作流程 ue框架:gameplay 组成 game mode 游戏类型和规则。可以控制游戏的开始与结束以及一些其他功能。 ac…...
在线base64转码工具
在线base64转码工具,无需登录,无需费用,用完就走。 官网地址: https://base64.openai2025.com 效果:...
2024年,我的技术探索与成长之路
2024年,我的技术探索与成长之路 2024年已经过去,作为一名技术爱好者和写作者,我回顾了过去一年在博客上记录的点滴,感慨良多。这一年,我不仅见证了技术的飞速发展,也在不断学习和实践中找到了自己的成长方向…...
【逆境中绽放:万字回顾2024我在挑战中突破自我】
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 一、引言二、个人成长与盘点情感与心理成长学习与技能提升其它荣誉 三、年度创作历程回顾创作内容概…...
图谱之前端关系应用
文章目录 图谱之前端关系应用(relation-graph、d3.js、echarts)1. relation-graph应用实例优缺点 2. d3.js应用实例优缺点 3. echarts应用实例优缺点 总结 图谱之前端关系应用(relation-graph、d3.js、echarts) 1. relation-grap…...
Kibana:ES|QL 编辑器简介
作者:来自 Elastic drewdaemon ES|QL 很重要 💪 正如你可能已经听说的那样,ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了,但随着时间的推移,它将成为与 Elasticsearch 中的数据交互的最强大…...
建造者模式(或者称为生成器(构建器)模式)
一、什么是建造者模式? 将复杂对象的构建与表示进行分离,使得统一的构建过程,可以创建出不同的对象表现模式 就是将复杂对象里面的成员变量,设置不同的值,使得生成出来的对象拥有不同的属性值; 二、特点…...
【CTFHub】SQL注入cookie注入及知识点
打开题目页面如下 根据提示应该在cookie处注入,通过burp suite抓包并发到重放器 知识点 Cookie 是存储在用户本地计算机上的小文件,由 Web 服务器通过 HTTP 协议发送给浏览器,并保存在用户的浏览器端。当用户再次访问该网站时,浏…...
CSS中样式继承+优先级
继承属性和非继承属性 一、定义及分类 1、继承属性是指在父元素上设置了这些属性后,子元素会自动继承这些属性的值,除非子元素显式地设置了不同的值。 常见的继承属性: 字体 font 系列文本text-align text-ident line-height letter-spacing颜色 col…...
[leetcode](找到vector中的特定元素并删除)无重复字符的最长子串
一.找到vector中的特定元素并删除 #include <iostream> #include <vector> #include <algorithm> int main() { // 示例 vector std::vector<int> vec {1, 2, 3, 4, 5, 6}; // 要删除的元素 int aim 3; // 查找元素 auto it std::fin…...
记录一次 centos 启动失败
文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…...
Linux使用SSH连接GitHub指南
基础配置流程 步骤1:生成SSH密钥 打开终端:首先,打开你的Linux终端。 生成SSH密钥对:输入以下命令来生成一个新的SSH密钥对: ssh-keygen -t rsa -b 4096 -C "your_email@example.com"-t rsa:使用RSA加密算法生成密钥。-b 4096:密钥长度为4096位,增加安全性。…...
QModbusTCPClient占用内存持续增长
最近使用QModbusTCPClient通信,需要频繁发送读写请求,发现软件占用内存一直在增减,经过不断咨询和尝试,终于解决了。 1.方案一(失败) 最开始以为是访问太频繁,导致创建reply的对象比delete re…...
具体场景的 MySQL 与 redis 数据一致性设计
场景1: 短视频修改名称,简介等视频数据更新还是清除更新策略如何设计?热 key 处理其他处理自己的数据查询 其他问题冷热突变/突然的热 key 加入如果产品要更新后能所有用户立马看到效果怎么办 ? 场景2: 抢红包如何设计?限制红包的数量 分布式锁的自旋问题 场景 3: 更改用户主…...
机器学习之SVD奇异值分解实现图片降维
SVD奇异值分解实现图片降维 目录 SVD奇异值分解实现图片降维1 SVD奇异值分解1.1 概念1.2 基本步骤1.2.1 矩阵分解1.2.2 选择奇异值1.2.3 重建矩阵1.2.4 降维结果 1.3 优缺点1.3.1 优点1.3.2 缺点 2 函数2.1 函数导入2.2 函数参数2.3 返回值2.4 通过 k 个奇异值降维 3 实际测试3…...
基于.Net Core+Vue的文件加密系统
1系统架构图 2 用例图 管理员角色的用例: 文件分享大厅:管理员可以访问文件分享大厅,下载文件。个人信息管理:管理员可以更新自己的个人信息,修改密码。用户管理:管理员负责创建、更新或删除用户账户&…...