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

Qt 系统相关 - 事件

目录

1. 事件介绍

2. 事件的处理

示例1:处理鼠标进入和离开

示例2:当鼠标点击时,获取对应的坐标值;

3. 按键事件

3.1 单个按键

3.2 组合按键

4. 鼠标事件

4.1 鼠标单击事件

4.2 鼠标释放事件

4.3 鼠标双击事件

4.4 鼠标移动事件

4.5 滚轮事件

5. 定时器

5.1 QTimerEvent 类

5.2 QTimer 类

5.3 获取系统日期及时间

6. 事件分发器

6.1 概述

6.2 事件分发器工作原理

​编辑7. 事件过滤器


1. 事件介绍

        前面我们学习了信号槽,它是用户进行的各种操作,可能会产生出信号,程序员给某个信号指定槽函数,当信号触发时,就能够自动的执行到对应的槽函数。事件和信号槽非常类似,用户进行的各种操作,也会产生事件。程序员同样可以给事件关联上处理函数(处理的逻辑),当事件触发的时候,就能够执行到对应的代码。

        事件本身是操作系统提供的机制,Qt 也同样把操作系统事件机制进行了封装,拿到了Qt 中,但是由于事件对应的代码编写起来不是很方便,所以 Qt 对于事件机制又进行了进一步的封装,就得到了信号槽。信号槽就是对于事件的进一步封装,事件是信号槽的底层机制。

        事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表示一个事件所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。常见的 Qt 事件如下:

常见事件描述:

事件名称描述
鼠标事件鼠标左键、鼠标右键、鼠标滚轮,鼠标的移动,鼠标按键的按下和松开
键盘事件按键类型、按键按下、按键松开
定时器事件定时时间到达
进入离开事件鼠标的进入和离开
滚轮事件鼠标滚轮滚动
绘屏事件重绘屏幕的某些部分
显示隐藏事件窗口的显示和隐藏
移动事件窗口位置的变化
窗口事件是否为当前窗口
大小改变事件窗口大小改变
焦点事件键盘焦点移动
拖拽事件用鼠标进行拖拽

2. 事件的处理

事件处理一般常用的方法为:重写相关的 Event 函数。

在 Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。如:在实现鼠标的进入和离开事件时,直接重新实现 enterEvent()leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下:


示例1:处理鼠标进入和离开

1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件,如下图示;

2、设计 UI 文件,如下图示;

3、这里需要创建 QLabel 的子类,重写 enterEvent 和 leaveEvent,在项目中新添加一个类:MyLabel;

  • 先选中项目名称 enterEventAndleaveEvent,点击鼠标右键,选择 add new ... ,弹出如下对话框:

4、选择:Choose .... ,弹出如下界面:

5、此时项目中会新添加以下两个文件:

6、要想重写父类的函数,就需要确保你这边写的函数名字和函数的参数列表都完全一致(形参名无所谓),为了防止单词拼写错误,我们可以在帮助文档中查找对应的内容;

7、点击 "显示" 之后,出现如下内容:

8、复制 enterEvent() 和 leaveEvent() ,粘贴在项目文件 "mylabel.h" 中;

9、重写 enterEvent() 和 leaveEvent() 方法;

10、上述代码,虽然重写了这俩函数,但是还是有点问题。运行程序,我们会发现鼠标进入和移出界面上没有一点反应。这是因为当前在界面上创建的这个 label 其实是 QLabel,不是咋们自己写的 Label,咋们必须要确保界面上的这个 label 是一个咋们自己定义的 Label 类的实例,程序才会执行到。解决办法也很简单,在 UI 文件中选中 Label,右键 ------> 提升为...

11、当点击 "提升为... " 之后,弹出如下对话框:

12、修改基类:

13、执行效果如下:当鼠标进入设计好的标签之后,就会在应用程序输出栏中打印:鼠标进入


示例2:当鼠标点击时,获取对应的坐标值;

  • 鼠标左键点击时,打印对应的坐标值,鼠标右键点击时,打印基于屏幕的坐标

        mousePressEvent 这个函数,按下左键、右键、滚轮都能触发,有的鼠标还带有前进后退侧键,也是可以触发的;但是还有的鼠标,有着更多的按键,这就不一定能触发了~

1、在上述示例的基础上,在 mylabel.h 中声明 mousePressEvent() 方法;

2、在 mylabel.cpp 中重写 mousePressEvent() 方法;

实现效果如下:

3. 按键事件

        Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时,键盘事件便会触发。在帮助文档中查找 QKeyEvent 类如下:

查找按键事件中所有的按键类型:在帮助文档中输入:Qt::Key,如下图: 

3.1 单个按键

示例:当某个按键被按下时,输出:某个按键被按下了;
1、新建项目,在头文件 "widget.h" 中声明虚函数 keyPressEvent():

2、在 "widget.cpp" 文件中重写 keyPressEvent() 虚函数:

实现效果如下:

3.2 组合按键

在 Qt 助手中搜索:Qt::KeyboardModifier,如下图示:

Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键一起使用,以实现一些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下:

Qt::NoModifier无修改键
Qt::ShiftModifierShift 键
Qt::ControlModifierCtrl 键
Qt::AltModifierAlt 键
Qt::MetaModifierMeta键(在Windows上指Windows键,在macOS上指Command键)
Qt::KeypadModifier使用键盘上的数字键盘进行输⼊时,Num Lock键处于打开状态
Qt::GroupSwitchModifier用于在输入法 组之间 切换

示例:

实现效果如下:

4. 鼠标事件

        在 Qt 中,鼠标事件是用 QMouseEvent 类来实现的。当在窗口中按下鼠标或者移动鼠标时,都会产生鼠标事件。

        利用 QMouseEvent 类可以获取鼠标的哪个键被按下了以及鼠标的当前位置等信息。在 Qt 帮助文档中查找 QMouseEvent类 如下图示:

4.1 鼠标单击事件

        在 Qt 中,鼠标按下是通过虚函数 mousePressEvent() 来捕获的。mousePressEvent() 函数原型如下:

[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

鼠标左右键及滚轮的表示如下:

  • Qt::LeftButton 鼠标左键
  • Qt::RightButton 鼠标右键
  • Qt::MidButton 鼠标滚轮

示例:鼠标左键 + 右键 + 滚轮

1、在 "widget.h" 头文件中声明鼠标按下事件;

2、在 "widget.cpp" 文件中重新实现 mousePressEvent() 函数;

实现效果如下:

4.2 鼠标释放事件

鼠标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。mouseReleaseEvent() 函数原型如下:

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)


示例:鼠标左键释放

1、在 "widget.h" 头文件中声明鼠标释放事件;

2、在 "widget.cpp" 文件中重新实现 mouseReleaseEvent() 函数; 

 实现效果如下:

4.3 鼠标双击事件

鼠标双击事件是通过虚函数:mouseDoubleClickEvent() 来实现的。mouseDoubleClickEvent() 函数原型如下:

[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)


示例:鼠标左键双击

1、在 "widget.h" 头文件中声明鼠标双击事件;

2、在 "widget.cpp" 文件中重新实现 mouseDoubleClickEvent() 函数; 

 实现效果如下:

4.4 鼠标移动事件

鼠标移动事件是通过虚函数:mouseMoveEvent() 来实现的。同时为了实时捕获鼠标位置信息,需要通过函数 setMouseTracking() 来追踪鼠标的位置。

mouseMoveEvent()函数原型如下:

  • [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

setMouseTracking()函数原型如下:

  • void setMouseTracking(bool enable)

说明:

        鼠标移动不同于鼠标按下。随便移动一下鼠标,就会产生出大量的鼠标移动事件。当你进行捕获事件的时候,尤其是在这里在进行一些复杂逻辑的时候,程序负担就很重,很容易产生卡顿之类的情况。

        Qt 为了保证程序的流畅性,默认情况下不会对鼠标移动进行追踪,鼠标移动的时候不会调用 mouseMoveEvent。除非显示告诉 Qt 要追踪鼠标位置。

        setMouseTracking() 函数默认是 false,需要设置为 true,才能实时捕获鼠标位置信息。否则只有当鼠标按下时才能捕获其位置信息。


示例:

1、在 "widget.h" 头文件中声明鼠标移动事件;

2、在 "widget.cpp" 文件中重新实现 mouseMoveEvent() 函数; 

 执行效果:

4.5 滚轮事件

在 Qt 中,鼠标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下:

int QGraphicsSceneWheelEvent::delta() const

其中返回值代表滚轮滑动的距离。正数表示滚轮相对于用户向前滑动,负数表示滚轮相对于用户向后滑动。


示例:

1、在 "widget.h" 头文件中声明鼠标滚轮事件;

2、在 "widget.cpp" 文件中重新实现 wheelEvent() 函数; 

执行效果:

5. 定时器

        Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些操作,或者制作一些动画效果,使用定时器就可以实现。所谓定时器就是在间隔一定时间后,去执行某⼀个任务。定时器在很多场景下都会使用到,如弹窗自动关闭之类的功能等。

Qt中的定时器分为 QTimerEvent QTimer 这2个类:

  • QTimerEvent类 用来描述一个定时器事件。在使用时需要通过 startTimer() 函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整型值代表这个定时器。当定时器溢出时(即定时时间到达)就可以在 timerEvent() 函数中获取该定时器的编号来进行相关操作。
  • QTimer类 来实现一个定时器,它提供了更高层次的编程接口,如:可以使用信号和槽,还可以设置只运行一次的定时器。

5.1 QTimerEvent 类

示例1:在UI界面上放置两个 Label 控件,⼀个让其1秒数字累加⼀次,⼀个让其2秒数字累加⼀次

1、新建项目,在UI界面文件放置两个 Label 控件;

2、在 "widget.h" 头文件中声明 timerEvent() 函数,并定义两个整型变量;

3、在 "widget.cpp" 文件中重写 timerEvent() 函数;

实现效果如下:

5.2 QTimer 类

示例:在UI界面放置一个 Label 标签,两个按钮,分别是 "开始" 和 "停止" ,当点击 "开始" 按钮时,开始每隔1秒计数⼀次,点击 "停止" 按钮时,暂停计数。

1、设计 UI 界面如下:

2、在 "widget.cpp" 文件中实现对应功能;

实现效果如下:

5.3 获取系统日期及时间

在 Qt 中,获取系统的日期及实时时间可以通过 QTimer 类 和 QDateTime类。

QDateTime类 提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定,可用的参数列表如下:


示例:获取系统日期及实时时间;

1、设计UI界面文件;放置⼀个 Label控件,用来显示日期及时间,放置两个按钮:"开始" 和 "停止" ;

2、在 "widget.h" 头文件中声明更新时间的槽函数;

3、在 "widget.cpp" 文件中实现对应功能;

实现效果如下:

6. 事件分发器

6.1 概述

        在 Qt 中,事件分发器(Event Dispatcher) 是⼀个核心概念,用于处理 GUI 应用程序中的事件。事件分发器负责将事件从⼀个对象传递到另⼀个对象,直到事件被处理或被取消。每个继承自 QObject类 或 QObject类 本身都可以在本类中重写 bool event(QEvent *e) 函数,来实现相关事件的捕获和拦截。

6.2 事件分发器工作原理

        在 Qt 中,我们发送的事件都是传给了 QObject 对象,更具体点是传给了 QObject 对象的 event() 函数。所有的事件都会进入到这个函数里面,那么我们处理事件就要重写这个 event() 函数。event() 函数本身不会去处理事件,而是根据 事件类型(type值)调用不同的事件处理函数。事件分发器就是工作在应用程序向下分发事件的过程中,如下图:

        如上图,事件分发器用于分发事件。在此过程中,事件分发器也可以做拦截操作。事件分发器主要是通过 bool event(QEvent *e) 函数来实现。其返回值为布尔类型,若为 ture,代表拦截,不向下分发。

        Qt 中的事件是封装在 QEvent类 中,在 Qt 助手中输入 QEvent 可以查看其所包括的事件类型,如下图示:


示例:

1、在 "widget.h" 头文件中声明 鼠标点击事件 和 事件分发器;如下图示:

2、在 "widget.cpp" 文件中实现 鼠标点击事件 和 拦截事件;

执行结果如下:

7. 事件过滤器

        在 Qt 中,一个对象可能经常要查看或拦截另外一个对象的事件,如对话框想要拦截按键事件,不让别的组件接收到,或者修改按键的默认值等。通过前面学习过的知识,我们已经知道,Qt 创建了 QEvent事件 对象之后,会调用QObject 的 event()函数 处理事件的分发。显然,我们可以在 event()函数 中实现拦截的操作。由于 event()函数是 protected 的,因此,需要继承已有类。如果组件很多,就需要重写很多个event()函数。这当然相当麻烦,更不用说重写 event()函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器。

事件过滤器是在应用程序分发到 event事件分发器 之前,再做⼀次更高级的拦截。如下图示:

事件过滤器的一般使用步骤:

  • 安装事件过滤器;
  • 重写事件过滤器函数:eventfilter() 。

示例:

1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件,如下图示;

2、设计 UI 文件,如下图示;

3、在项目新添加⼀个类:MyLabel;

先选中项目名称 QEvent,点击鼠标右键,选择 add new ... ,弹出如下对话框:

4、选择:Choose .... ,弹出如下界面:

5、此时项目中会新添加以下两个文件:

6、在 UI 文件中选中 Label,右键 ------> 提升为...

7、当点击 "提升为... " 之后,弹出如下对话框:

8、在 "mylabel.h" 中声明 鼠标点击事件 和 事件分发器;

9、在 "mylabel.cpp" 文件中实现鼠标点击事件和事件分发器;

10、在 "widget.h" 头文件中声明事件过滤器函数;

11、在 "widget.cpp" 文件中实现事件过滤器的两个步骤;

执行结果如下所示:

 

相关文章:

Qt 系统相关 - 事件

目录 1. 事件介绍 2. 事件的处理 示例1:处理鼠标进入和离开 示例2:当鼠标点击时,获取对应的坐标值; 3. 按键事件 3.1 单个按键 3.2 组合按键 4. 鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标…...

Ubuntu最小化命令行系统 安装GUI 远程桌面

Ubuntu 服务器 安装GUI 更新、升级 sudo apt update && sudo apt upgrade安装桌面环境 sudo apt install taskselsudo apt install ubuntu-desktop安装显示登录管理器 sudo apt install lightdm安装 lightdm 时系统会让选择默认的显示管理器,选择lightd…...

Web前端:CSS篇(二)背景,文本,链接

CSS 背景 背景颜色 background-color 属性定义了元素的背景颜色. 页面的背景颜色使用在body的选择器中: body {background-color:#b0c4de;} CSS中,颜色值通常以以下方式定义: 十六进制 - 如:"#ff0000"RGB - 如:"rgb(255,0…...

ubuntu 24.04 软件源配置,替换为国内源

ubuntu 默认的官网源下载速度非常慢,新装 ubuntu 系统首先把 apt 软件源替换成国内源。 1、使用软件和更新设置国内源 打开软件和更新,选择位于中国的服务器: 外链图片转存失败,源站可能有防盗链机制,建议将图片保存…...

【Java 并发编程】(三) 从CPU缓存开始聊 volatile 底层原理

并发编程 三大问题 在并发编程中,原子性、有序性和可见性是三个重要的问题,解决这三个问题是保证多线程程序正确性的基础。原子性: 指的是一个操作不可分割, 要么全部执行完成, 要么不执行, 不存在执行一部分的情况.有序性: 有序性是指程序的执行顺序与…...

YOLOV8网络结构|搞懂Backbone-Conv

参数量计算: (输入通道*w)*(输出通道*w)*k^2+(输出通道*w)*2 w是模型缩放里面的width - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 输出通道c2=64,k=3,s=2 P1/2 特征图变小一半 先定义算子层 再搭一个forward前向传播 class Conv(nn.Module):"""Standard convo…...

Elasticsearch Nested类型详解与实战

Elasticsearch(简称ES)是一个基于Lucene的全文搜索引擎,它提供了强大的搜索能力以及对数据的高效索引和查询。在ES中,数据通常以JSON格式存储,并且可以采用多种数据类型。其中,nested类型是一种特殊的对象数…...

网络编程,网络协议,UDP协议

网络: 1.协议:通信双方约定的一套标准 2.国际网络通信协议标准: 1.OSI协议: 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …...

每日一题——第六十三题

题目&#xff1a;判断一个数是否为合数 #include <stdio.h> #include <stdbool.h> // 为了使用bool类型 // 函数声明&#xff0c;用于判断是否为合数 bool isComposite(int x); int main() { int x; printf("请输入一个正整数: "); scanf(&quo…...

人工智能算法,图像识别技术;基于大语言模型的跨境商品识别与问答系统;图像识别

目录 一 .研究背景 二,大语言模型介绍 三,数据采集与预处理 商品识别算法 四. 跨境商品问答系统设计 五.需要源码联系 一 .研究背景 在当今全球化的背景下&#xff0c;跨境电商行业迅速发展&#xff0c;为消费者提供了更广泛的购物选择和更便利的购物方式。然而&#xf…...

数据库系统 第18节 数据库安全

数据库安全是确保数据库管理系统&#xff08;DBMS&#xff09;中存储的数据的保密性、完整性和可用性的过程。以下是一些关键的数据库安全措施&#xff1a; 用户身份验证&#xff08;Authentication&#xff09;&#xff1a; 这是确定用户或系统是否有权访问数据库的第一步。通…...

Golang | Leetcode Golang题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; func countBits(n int) []int {bits : make([]int, n1)for i : 1; i < n; i {bits[i] bits[i&(i-1)] 1}return bits }...

【Python变量简析】

Python变量简析 在 Python 中&#xff0c;变量是用于存储和操作数据的命名内存位置。变量的概念类似于代数中的方程变量&#xff0c;比如对于方程式 y x * x &#xff0c;x 就是变量。 Python 变量具有以下特点&#xff1a; 变量名可以由字母、数字和下划线组成&#xff0c…...

智慧零售模式下物流优化与开源AI智能名片S2B2C商城系统的深度融合

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;智慧零售模式正逐步成为零售业的新常态。该模式通过深度融合物联网、大数据、人工智能等先进技术&#xff0c;实现了线上线下无缝衔接&#xff0c;为消费者提供了更加便捷、个性化的购物体验。物流作为智慧零售的重要支撑&…...

socket和websocket 有什么区别

Socket 和 WebSocket 都用于网络通信&#xff0c;但它们的用途、协议、以及使用方式有所不同。以下是两者的主要区别&#xff1a; ### 1. **基础协议** - **Socket**: - Socket 是网络通信的一个抽象概念&#xff0c;通常基于传输层协议&#xff0c;如 TCP&#xff08…...

亿玛科技:TiDB 6.1.5 升级到 7.5.1 经验分享

作者&#xff1a; foxchan 原文来源&#xff1a; https://tidb.net/blog/6e628afd 为什么要升级&#xff1f; 本次升级7.5的目的如下&#xff1a; 1、tidb有太多的分区表需要归档整理。7.5版本这个功能GA了。 2、之前集群tikv节点的region迁移过慢&#xff0c;影响tikv节…...

8.16-ansible的应用

ansible ansible是基于模块工作的&#xff0c;本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块&#xff0c;ansible只是提供一种框架。 格式 ansible 主机ip|域名|组名|别名 -m ping|copy|... 参数 1.ping模块 m0 # 查看有没有安装epel ​ [rootm0 ~]#…...

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离&#xff08;Edit Distance&#xff09;&#xff0c;也称为Levenshtein距离&#xff0c;是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数&#xff0c;这些操作包括插入、删除或替换一个字符。 计算方法 …...

初识FPGA

大学的时候有一门verilog语言&#xff0c;觉得很难&#xff0c;不愿学。有学习套件是黑金的一块FPGA开发板&#xff0c;可能当时点灯和点数码管了。全都忘了。 今项目需要&#xff0c;使用FPGA中的ZYNQ&#xff0c;需要c语言开发&#xff0c;随即开始学习相关知识。 ZYNQ内部…...

探索 JavaScript:从入门到精通

目录 1. JavaScript 的介绍与基础 示例&#xff1a;弹出欢迎信息 JavaScript&#xff0c;作为网络时代最流行的脚本语言之一&#xff0c;赋予了网页生动活泼的动态功能。无论是新手还是经验丰富的开发者&#xff0c;掌握 JavaScript 的核心概念和技能都是开启网络编程之门的钥…...

这4款视频压缩软件堪称是压缩界的神器!

视频在我们的日常设备当中会占用相对较多的空间&#xff0c;尤其是喜欢用视频记录的朋友。但是过多过大的视频不仅会给我们的设备带来了压力&#xff0c;也不利于分享和管理。今天我就要给大家分享几个视频压缩的小妙招。 1、福昕压缩 直通车&#xff1a;www.foxitsoftware.cn…...

【ARM 芯片 安全与攻击 5.6 -- 侧信道与隐蔽信道的区别】

文章目录 侧信道与隐蔽信道的区别侧信道攻击(Side-channel Attack)侧信道攻击简介侧信道攻击 使用方法侧信道攻击示例隐蔽信道(Covert Channel)隐蔽信道简介隐蔽信道使用方法隐蔽信道代码示例侧信道与隐蔽信道在芯片及系统安全方面的使用侧信道的应用隐蔽信道的应用Summary…...

C#:Bitmap类使用方法—第4讲

大家好&#xff0c;今天接着上一篇文章继续讲。 下面是今天的方法&#xff1a; &#xff08;1&#xff09;Bitmap.MakeTransparent 方法&#xff1a;使此 Bitmap的默认透明颜色透明。 private void MakeTransparent_Example1(PaintEventArgs e) { // Create a Bitmap object…...

Vue是如何实现nextTick的?

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue.js 的 nextTick 函数是一个非常重要的功能&#xff0c;它用于延迟执行代码块到下次 DOM 更新循环之后。这在 Vue.js 的异步更新队列机制中非常有用&#xff0c;尤其是在你需要基于更新后的 DOM 来…...

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65&#xff08;主&#xff09;15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…...

《c++并发编程实战》 笔记

《c并发编程实战》 笔记 1、你好&#xff0c;C的并发世界为什么要使用并发 第2章 线程管理2.1.1 启动线程2.2 向线程函数传递参数2.5 识别线程 第3章 线程间共享数据3.2.1 C中使用互斥量避免死锁的进阶指导保护共享数据的替代设施 第4章 同步并发操作4.1 等待一个事件或其他条件…...

57qi5rW35LqRZUhS pc.mob SQL注入漏洞复现

0x01 产品简介 57qi5rW35LqRZUhS是大中型企业广泛采用人力资源管理系统。某云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 57qi5rW35LqRZUhS pc.mob 接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例…...

微信小程序--27(自定义组件4)

一、父子组件之间通信的3种方式 1、属性绑定 用于父组件向子组件的只当属性设置数据&#xff0c;但只能设置JSON兼容的数据 2、事件绑定 用于子组件向父组件传递数据&#xff0c;可以传递任意数据 3、获取组件实例 父组件还可以通过this.select Component()获取子组件的实…...

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考&#xff1a;为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构&#xff1f; 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…...

VBA技术资料MF184:图片导入Word添加说明文字设置格式

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

在函数设计中应用单一职责原则:函数分解与职责分离

在函数设计中应用单一职责原则&#xff1a;函数分解与职责分离 引言 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;是面向对象设计原则中的核心原则之一&#xff0c;强调一个类或函数应该只有一个责任或理由去改变。在函数设计中&#xff0c;应…...

多线程锁机制面试

目录 乐观锁的底层原理 ReentrantLock的实现原理 读写锁 ReentrantReadWriteLock synchronized 底层原理 Lock和synchronized的区别 乐观锁的底层原理 版本号机制 在数据库表中添加一个版本号字段&#xff08;如 version&#xff09;&#xff0c;每次更新数据时都会将版本号…...

《SQL 中计算地理坐标两点间距离的魔法》

在当今数字化的世界中&#xff0c;地理数据的处理和分析变得越来越重要。当我们面对一个包含地理坐标数据的表时&#xff0c;经常会遇到需要计算两点之间距离的需求。无论是在物流配送路线规划、地理信息系统应用&#xff0c;还是在基于位置的服务开发中&#xff0c;准确计算两…...

微服务可用性设计

一、隔离 对系统或资源进行分割&#xff0c;实现当系统发生故障时能限定传播范围和影响范围。进一步的&#xff0c;通过隔离能够降低系统之间得耦合度&#xff0c;使得系统更容易维护和扩展。某些业务场景下合理使用隔离技巧也能提高整个业务的性能。我理解隔离本质就是一种解…...

【扒代码】dave readme文档翻译

jerpelhan/DAVE (github.com) 摘要 低样本计数器估算选定类别对象的数量&#xff0c;即使在图像中只有少量或没有标注样本的情况下。目前最先进的技术通过对象位置密度图的总和来估算总数量&#xff0c;但这种方法无法提供单个对象的位置和大小&#xff0c;这对于许多应用来说…...

c语言---文件

这一节我准备分三个部分来带领大家了解文件 ——一、有关文件的基础知识 ————二、文件的简单操作 ————————三、文件结束的判定 ————————————四、文件缓冲区 一、文件的基础知识&#xff1a; 首先在了解文件之前&#xff0c;我们需要了解C/C程序内存…...

Windows系统下Go安装与使用

step1&#xff1a; 下载go语言SDK 下载地址&#xff1a;https://go.dev/dl/ 下载后选择合适位置安装即可&#xff0c;我选择D盘 在安装完成后&#xff0c;可以通过go env 命令检测是否安装成功。在“命令提示符”界面输入“go env”命令&#xff0c;如果显示如下类似结果则说明…...

day24-测试之接口测试基础

目录 一、接口的定义 二、接口的优点 三、API接口 四、接口测试流程 五、网络基础概念 六、HTTP和RURL 七、get和post请求 八、数据格式 九、状态码 十、restful风格 十一、接口工具 一、接口的定义 程序之间协作所要遵循的一套规范、标准 二、接口的优点 2.1.责任…...

TSN 交换机

TSN&#xff08;Time-Sensitive Networking&#xff09;交换机是一种支持时间敏感网络协议的网络交换设备&#xff0c;用于在以太网网络中实现低延迟、高确定性的数据传输。TSN 是一组 IEEE 802 标准的集合&#xff0c;旨在通过标准化的方式&#xff0c;将传统的以太网扩展到需…...

针对thinkphp站点的漏洞挖掘和经验分享

0x1 前言 浅谈 目前在学习和研究thinkphp相关漏洞的打法&#xff0c;然后最近对于thinkphp资产的收集方面有了一个简单的认识&#xff0c;然后写一篇新手看的thinkphp相关的漏洞收集和挖掘的文章来分享下。然后后面是给师傅们分享下后台文件上传&#xff0c;然后直接打一个ge…...

MySQL数据库入门,pycharm连接数据库—详细讲解

一.安装MySQL 1.常用MySQL5.7&#xff0c;首先安装MySQL&#xff0c; &#xff08;一&#xff09; &#xff08;二&#xff09; &#xff08;三&#xff09; &#xff08;四&#xff09; &#xff08;五&#xff09; 2.配置环境变量 打开MySQL安装路径&#xff0c;在其中找到…...

.bat文件快速运行vue项目

如何使用bat文件快速运行vue项目&#xff1f; 新建个文件&#xff0c;改名为serve.bat。 在文件中写入以下内容&#xff1a; # cd 项目路径 cd D:\projects\xxx npm run serve pausecd 项目所在的路径 npm run dev/serve &#xff0c;取决于项目的启动方法&#xff0c;打…...

数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序

1.算法 作为完全二叉堆的一个应用&#xff0c;这节来介绍堆排序算法。 是的&#xff0c;谈到优先级队列&#xff0c;我们很自然地就会联想到排序。因为就其功能而言&#xff0c;包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能&#xff0c;也就是选取其中的最大…...

npm install pnpm -g 报错的解决方法

npm install pnpm -g 报错的解决方法 npm error code ETIMEDOUT npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/pnpm failed, reason: npm error network This is a problem related to network connectivity. npm error network In mo…...

集师知识付费小程序开发

智慧生活&#xff0c;从选择一款优质知识付费小程序起航 在这个信息爆炸的时代&#xff0c;知识成为了最宝贵的财富。我们渴望不断学习&#xff0c;提升自我&#xff0c;追求更高品质的生活。而一款优质的知识付费小程序&#xff0c;就如同照亮前行道路的明灯。 它是知识的宝库…...

前端开发提效工具——用户自定义代码片段

做开发总是会有大量的代码要写&#xff0c;但是有时候某些代码是非常基础但是很多&#xff0c;我们就可以把这一部分整合起来&#xff0c;使用一个很简短的关键字来快速唤出。 如何新建这样的代码段&#xff1f; 1.在VSCode当中找到Snippets&#xff0c;然后点击 2.之后会弹出…...

docker容器安全加固参考建议——筑梦之路

这里主要是rootless的方案。 在以 root 用户身份运行 Docker 会带来一些潜在的危害和安全风险&#xff0c;这些风险包括&#xff1a; 容器逃逸&#xff1a;如果一个容器以 root 权限运行&#xff0c;并且它包含了漏洞或者被攻击者滥用&#xff0c;那么攻击者可能会成功逃出容器…...

基于 Appium 的 App 爬取实战

除了运行 Appium 的基本条件外&#xff0c;还要一个日志输出库 安装&#xff1a; pip install loguru 思路分析 首先我们观察一下整个 app5 的交互流程&#xff0c;其首页分条显示了电影数据&#xff0c; 每个电影条目都包括封面&#xff0c;标题&#xff0c; 类别和评分 4…...

nvm与node安装

参考&#xff1a; 一文搞定NVM安装所有问题NVM UI解决nodejs下载慢问题 node_mirror: http://npmmirror.com/mirrors/node/ npm_mirror: http://registry.npmmirror.com/mirrors/npm/解决nvm list available报错问题 Could not retrieve https://npm.taobao.org/mirrors/node/…...

【电子通识】什么是MSL湿敏等级

潮敏失效是塑料封装表贴器件在高温焊接工艺中表现出来的特殊的失效现象。 造成此类问题的原因是器件内部的潮气膨胀后使得器件发生损坏。 MSL是“Moisture Sensitivity Level&#xff08;湿气敏感性等级&#xff09;”的缩写&#xff0c;针对需进行回流焊的产品设定了MSL基准。…...