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

【QT】事件系统入门——QEvent 基础与示例

一、事件介绍

事件是 应用程序内部或者外部产生的事情或者动作的统称

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

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

常见的 QT 事件如下:

image-20250128131332619

不同场景下,要关注的点不一样。这些事件的子类中就会包含一些对应的不同属性。

常见事件描述:

从图片中提取的文字信息如下表所示:

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

二、事件的处理

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

在 Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。

比如:在实现鼠标的进入和离开事件时,直接重新实现 enterEvent()leaveEvent() 即可。enterEvent()leaveEvent() 函数原型如下:
img

🐇标签提升 & 演示

1)新建 Qt 项目

基类选择 QWidget,同时勾选 UI 界面文件,并且设计 UI 文件,如下:

image-20250129160200592

  • 有了边框,方便观察当前鼠标是否进入和离开

这里我们还需要创建 QLabel 子类,来重写 enterEventleaveEvent

2)在项目中新添加一个类

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

img

3)定义类名并选择基类

image-20250129160800887

4)此时项目中会新添加以下两个文件

img

5)修改基类,重写 enterEvent()leaveEvent

如果我们想了解这两个函数,则可以在 帮助文档 中查找对应的内容

  • 要想重写父类的函数就需要确保写的函数名字和函数的参数列表完全一致(形参名无所谓)。
  • 然后对这两个函数进行重写

label.hlabel.cpp 代码如下:

image-20250129161706755

但是当前代码还是有问题的,如下:

image-20250129163141755

  • 在 UI 文件中我们可以看到当前在界面上创建的这个 Label 并不是自己写的 Label,而是 QLabel
  • 但是我们需要确保界面上的这个 Label 是自己定义的 Label 类实例才会被执行,因此需要 提升

6)在 UI 文件中选中 Label,右键 ——> 提升为…,点击之后弹出如下:

image-20250129161405787

  • 这里需要确保这里填写的类名以及头文件 和 上述自定义的 类名头文件 匹配

💡 通过 “提升为…” 这样的方式就可以把 Qt Designer 中托上去的控件的类型转换成自定义的控件类型,如下:

img

7)执行效果

当鼠标进入设计好的标签之后,就会在应用程序输出栏中打印:enterEvent;鼠标移出设计好的标签之后,就会在应用程序输出栏中打印:leaveEvent

image-20250129163712359

  • 这个时候就说明当前的 enterEventleaveEvent 这两个事件就被我们给捕获到了。

🐇 示例 – 当鼠标点击时,获取对应的坐标值

该示例主要基于上面代码,实现:当鼠标点击时,获取对应的坐标值

void Label::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {qDebug() << "按下左键";} else if (event->button() == Qt::RightButton) {qDebug() << "按下右键";}// 当前 event 对象就包含了鼠标点击位置的坐标.qDebug() << event->x() << ", " << event->y();// globalX 和 globalY 是以屏幕左上角为原点, 获取的坐标.qDebug() << event->globalX() << ", " << event->globalY();
}

实现效果如下:

img

  • 我们这里就通过事件 获取到 鼠标点击 的位置
  • mouseEvent 这个函数 其实按左键、右键、滚轮都可以触发的,甚至还有 前进 后退侧键

三、键盘按键事件

  • Qt 中 QShortCut 是信号槽机制封装过 获取 键盘按键的 方式
  • 当然我们也可以从更底层角度,通过事件获取到当前用户键盘按下情况

Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时,键盘事件便会触发。

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

img

1. 单个按键

示例:当某个按键被按下时,输出:某个按键被按下了;

  1. 新建项目,在头文件 “widget.h” 中声明虚函数 keyPressEvent();
  2. 然后重写 keyPressEvent() 虚函数,如下图

image-20250129202354185

2. 组合按键

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

img

Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。

在 Qt 中,键盘事件可以与修改键以起使用,以实现一些复杂的交互操作。

KeyboardModifier 中修改键的具体描述如下:

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

这些修饰键常用于编程中处理键盘事件,特别是在使用Qt框架开发跨平台应用程序时。

代码如下:

void Widget::keyPressEvent(QKeyEvent *event)
{if(event->key() == Qt::Key_A){qDebug() << "A 按键被按下";}if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_A){qDebug() << "Ctrl + A 按键被按下";}
}

四、鼠标事件

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

  • 利用 QMouseEvent 类可以获取鼠标的哪个键被按下了以及鼠标的当前位置等信息。

在 Qt 帮助文档中查找 QMouseEvent 类如下图示:

img

鼠标单击 | 释放 | 双击 | 移动 事件

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

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

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

  1. Qt::LeftButton 鼠标左键

  2. Qt::RightButton 鼠标右键

  3. Qt::MidButton 鼠标滚轮

void Label::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {qDebug() << "按下左键";} else if (event->button() == Qt::RightButton) {qDebug() << "按下右键";}
}

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

  • [ virtual protected] void QWidget:: mouseReleaseEvent (QMouseEvent * event )
void Label::mouseReleaseEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {qDebug() << "释放左键";} else if (event->button() == Qt::RightButton) {qDebug() << "释放右键";}
}

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

  • [ virtual protected] void QWidget:: mouseDoubleClickEvent (QMouseEvent * event )
void Label::mouseDoubleClickEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {qDebug() << "双击左键";} else if (event->button() == Qt::RightButton) {qDebug() << "双击右键";}
}

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

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

setMouseTracking() 函数原型如下:

  • void setMouseTracking( bool enable )

说明:setMouseTracking() 函数默认是 false,需要设置为 true,才能实时捕获鼠标位置信息。

否则只有当鼠标按下时才能捕获其位置信息。
image-20250129172741229

  • 上面的操作其实和 二中说的标签提升 那里一样,可以仔细看看

最后演示结果如下:

image-20250129173003843

  • 这里演示的话,还是把实时捕捉关了,敏感太高不适合演示现象,我们这里坐标可以长按拖拽鼠标也可以显示 鼠标位置信息
  • 我们这里重写鼠标事件的操作都是放在 自定义的 Label 中完成的,此时只有鼠标在 Label 范围内进行动作才能捕捉到
  • 当前也可以把其放到 Widget(Qwidget 子类) 来完成,此时鼠标在整个窗口都可以捕捉到

五、定时器

Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些操作,或者制作一些动画效果,使用定时器就可以实现。

所谓 定时器就是在间隔一定时间后,去执行某一个任务

定时器在很多场景下都会使用到,如弹窗自动关闭之类的功能等。

Qt 中的定时器分为 QTimerEventQTimer 这 2 个类。

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

1. QTimerEvent 类

联系前文:【QT】 控件 – 显示类

在 UI 界面上放置一个 LCD Number 控件,让其 10 秒数字不断递减到 0,相当于倒计时。

  1. 新建项目,在 UI 界面文件放置一个 LCD Number 控件,并且给定初始值为 10
  2. 在 “widget.h” 头文件中声明 timerEvent() 函数,并定义一个整型变量
  3. 在 “widget.cpp” 文件中重写 timerEvent() 函数
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 开启定时器事件// 此处 timerId 是一个定时器的身份标识(类似于 Linux 中的文件描述符)timerId = this->startTimer(1000); // 这里 timerId 设为成员变量
}void Widget::timerEvent(QTimerEvent *event)
{// 如果一个程序中存在多个定时器 (startTimer 创建的定时器), 此时每个定时器都会触发 timerEvent 函数.// 先判定一下这次触发是否是想要的定时器触发的.if (event->timerId() != this->timerId) {// 如果不是我们的定时器触发的, 就直接忽略.// 当前程序中只有这一个定时器.return;}int value = ui->lcdNumber->intValue();if (value <= 0) {// 停止定时器this->killTimer(this->timerId);return;}value -= 1;ui->lcdNumber->display(value);
}
  • 此时运行程序就可以获得我们想要的倒计时结果了

但是相比于 QTimer ,使用 timerEvent 还是要更加复杂一点,因为需要手动管理 timerId,需要区分整个函数调用是由哪个 timer 引起

2. QTimer 类

纯代码实现,无调用 ui

  • 实现基本的计时功能
  • 还实现了**【获取系统日期及实时时间】**,如下:
#include "widget.h"
#include "ui_widget.h"#include <QVBoxLayout>
#include <QLabel>
#include <QTimer>
#include <QPushButton>
#include <QDateTime>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QVBoxLayout *layout = new QVBoxLayout(this);// 创建控件QLabel *label = new QLabel("0");label->setStyleSheet("font-size: 50px; color: red;");QLabel *label_date = new QLabel("0");label_date->setStyleSheet("font-size: 50px; color: blue;");QPushButton *startBtn = new QPushButton("开始");QPushButton *stopBtn = new QPushButton("停止");// 按钮布局QHBoxLayout *btnLayout = new QHBoxLayout;btnLayout->addWidget(startBtn);btnLayout->addWidget(stopBtn);// 主布局layout->addWidget(label, 0, Qt::AlignCenter);layout->addWidget(label_date, 0, Qt::AlignCenter);layout->addLayout(btnLayout);// 创建定时器和计数器QTimer *timer = new QTimer(this);// 连接信号与槽connect(timer, &QTimer::timeout, [=](){static int num=1;label->setText(QString::number(num++));});connect(timer, &QTimer::timeout, [=](){QString str=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");label_date->setText(str);});connect(startBtn, &QPushButton::clicked, [=](){timer->start(1000);});connect(stopBtn, &QPushButton::clicked, [=]{timer->stop();});
}

结果如下:

image-20250129220136849

六、事件分发器

1. 概述

在 Qt 中,事件分发器(Event Dispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。

事件分发器负责 将事件从一个对象传递到另一个对象,直到事件被处理或被取消。

每个继承自 QObject 类QObject 类 本身都可以在本类中 重写 bool event(QEvent *e) 函数,来实现相关事件的捕获和拦截。

2. 事件分发器工作原理

在 Qt 中,我们发送的事件是传给了 QObject 对象的 event() 函数。

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

如上图,事件分发器用于分发事件。在此过程中,事件分发器也可以做 拦截操作

  • 事件分发器主要是通过 bool event(QEvent *e) 函数来实现。其返回值为布尔类型,若为 true,代表拦截,不向下分发。
  • Qt 中的事件是封装在 QEvent类 中,在 Qt 助手中输入 QEvent 可以查看其所包括的事件类型,如下图示:

image-20250128133052036

演示代码如下:

void Widget::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){qDebug() << "鼠标左键按下";}
}bool Widget::event(QEvent *ev)
{if(ev->type() == QEvent::MouseButtonPress){qDebug() << "Event 中鼠标被按下";return true; // 表示不向下分发}// 其他事件交给父类处理(默认)return QWidget::event(ev);
}

结果如下:

image-20250129220805361

当我们 return false 时,就会出现一下结果

image-20250129221037788

  • 单机鼠标右键,鼠标被按下
  • 单击鼠标左键, event 函数和 mousePressEvent 函数交替触发

七、事件过滤器

在 Qt 中,一个对象可能经常要查看或拦截另外一个对象的事件,如对话框想要拦截按键事件,不让别的组件接收到,或者修改按键的默认值等。

  • 通过上面的学习,我们已经知道,Qt 创建了 QEvent 事件对象之后,会调用 QObjectevent() 函数 处理事件的分发。
  • 显然,我们可以在 event() 函数中实现拦截的操作。由于 event() 函数是 protected 的,因此,需要继承已有类。
  • 如果组件很多,就需要重写很多个 event() 函数。这当然相当⿇烦,更不用说重写 event() 函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器

事件过滤器是在 应用程序 分发到 event 事件分发器 之前,再做一次更高级的拦截

img

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

  1. 安装事件过滤器;
  2. 重写事件过滤器函数:eventfilter()

【示例】:基于文章上面演示的 标签提升 那的操作,在 "Label.cpp" 中代码如下:

#include "label.h"
#include <QDebug>
#include <QMouseEvent>Label::Label(QWidget* parent): QLabel(parent)
{}void Label::mousePressEvent(QMouseEvent *event)
{QString str = QString("鼠标按下: x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << str.toUtf8().data();
}bool Label::event(QEvent *e)
{//如果是鼠标按下,在event事件分发时做拦截操作if (e->type() == QEvent::MouseButtonPress){QMouseEvent *event = static_cast<QMouseEvent *>(e);QString str = QString("Event函数中鼠标按下: x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << str.toUtf8().data();return true; //返回true,代表用户自己处理,不向下分发}//其他事件交给父类处理return QLabel::event(e);
}

Widget.cpp 代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 给 label 装上事件过滤器 this;当前窗口安装事件过滤器ui->label->installEventFilter(this);
}bool Widget::eventFilter(QObject *obj, QEvent *e)
{if(obj == ui->label) // 判断控件{if(e->type() == QEvent::MouseButtonPress){QMouseEvent *event = static_cast<QMouseEvent *>(e);QString str = QString("事件过滤器中鼠标按下: x = %1, y = %2").arg(event->x()).arg(event->y());qDebug() << str.toUtf8().data();return true; // 返回true,代表用户自己处理,不向下分发}}return QWidget::eventFilter(obj, e);
}
  • 注意书写函数实现时,记得先声明函数名

结果如下:

img

八、其他

  • moveEvent:窗口移动时触发的事件
  • resizeEvent:窗口大小改变时触发的事件

image-20250130163923426

相关文章:

【QT】事件系统入门——QEvent 基础与示例

一、事件介绍 事件是 应用程序内部或者外部产生的事情或者动作的统称 在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&…...

⚡️Jolt -- 通过JSON配置来处理复杂数据转换的工具

简介&#xff1a;一个能够通过JSON配置&#xff08;特定的语法&#xff09;来处理复杂数据转换的工具。 比如将API响应转换为内部系统所需的格式&#xff0c;或者处理来自不同来源的数据结构差异。例如&#xff0c;将嵌套的JSON结构扁平化&#xff0c;或者重命名字段&#xff0…...

2025-03-13 禅修-错误的做法

摘要: 2025-03-13 禅修-错误的做法 禅修-错误的做法 我们今天的课程是这个禅修防误。主要是有一些我们所明令禁止的。在整个禅修过程中&#xff0c;会对我们禅修出现一些弊端的这部分&#xff0c;我们会给大家介绍。第一&#xff0c;在禅修中要防止自由联想&#xff0c;防止幻…...

uni-app学习笔记——自定义模板

一、流程 1.这是一个硬性的流程&#xff0c;只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面&#xff0c;都如第二步一样&#xff1b;可以选择自定义的模版&#xff08;vue3Setup——这是我自己的模版&#xff09;&#xff0c;第二步的…...

【医院绩效管理专题】8.医院绩效数据的收集与整理方法:洞察现状,引领未来

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院绩效管理已成为提升医疗服务质量、优化运营效率、增强综合竞争力的关键因素。而绩效数据的收集与整理作为绩效管理的基础环节,其科学性、准确性和完整性直…...

麒麟系统如何安装Anaconda

在银河麒麟操作系统&#xff08;Kylin OS&#xff09;中安装 Anaconda 的步骤相对简单&#xff0c;以下是基于搜索结果整理的详细安装指南&#xff1a; 步骤 1&#xff1a;下载 Anaconda 安装脚本 打开浏览器&#xff0c;访问 Anaconda 官方下载页面。选择适合 Linux 系统的安…...

Linux网络套接字编程——UDP服务器

Linux网络套接字编程——创建并绑定-CSDN博客 前面已经介绍了网络套接字的创建和绑定&#xff0c;这篇文章会通过UDP套接字实现一个UDP服务器。 先介绍将使用的接口。 recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr,…...

deepseek+kimi做ppt教程记录

1.首先注册deepseek和kimi deepseek官网&#xff1a;https://chat.deepseek.com/ kimi官网&#xff1a;https://kimi.moonshot.cn/ 以下以一篇工作总结报告为例 2.使用deepseek生成ppt大纲 让deepseek生成kimi生成ppt所需要的内容时&#xff0c;需要注意提示词内容&#xff0c;…...

Cursor 终极使用指南:从零开始走向AI编程

Cursor 终极使用指南&#xff1a;从零开始走向AI编程 问什么是cursor? mindmaproot(Cursor核心功能)智能编码代码生成自动补全错误修复项目管理多窗口布局版本控制终端集成个性设置主题定制快捷键配置插件扩展AI协作对话编程知识检索文档生成前些天发现了一个巨牛的人工智能学…...

TiDB 观测性解读(一)丨索引观测:快速识别无用索引与低效索

导读 可观测性已经成为分布式系统成功运行的关键组成部分。如何借助多样、全面的数据&#xff0c;让架构师更简单、高效地定位问题、分析问题、解决问题&#xff0c;已经成为业内的一个技术焦点。本系列文章将深入解读 TiDB 的关键参数&#xff0c;帮助大家更好地观测系统的状…...

批量将 Excel 文档中的图片提取到文件夹

前面我们介绍过如何批量删除 Excel 文档中的所有图片或者指定的图片&#xff0c;其中就需要用到批量提取 Excel 文档中图片的操作。我们如何才能够将 Excel 文档中的图片快速的提取出来呢&#xff1f;其实单个 Excel 文档中的图片提取到文件夹中是有多种方法可以完成的&#xf…...

postgresql 数据库使用

目录 索引 查看索引 创建 删除索引 修改数据库时区 索引 查看索引 select * from pg_indexes where tablenamet_table_data; 或者 select * from pg_statio_all_indexes where relnamet_table_data; 创建 CREATE INDEX ix_table_data_time ON t_table_data (id, crea…...

怎样进行相关论文的调研——How to conduct research on relevant papers?

怎样进行相关论文的调研 写在前面1.打开Web of Science2.检索同类表达3.构建“检索式”什么是“检索式” 参考内容 写在前面 偶然间刷到一篇知乎文章&#xff0c;顺着文章的推荐看了钟澄老师的科研论和在B站上的教学视频&#xff0c;深入了解后发现读文章还有这么多讲究&#…...

蓝桥杯备赛-基础练习 day1

1、闰年判断 问题描述 给定一个年份&#xff0c;判断这一年是不是闰年。 当以下情况之一满足时&#xff0c;这一年是闰年:1.年份是4的倍数而不是100的倍数 2&#xff0e;年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个…...

本地算力部署大模型详细流程(一)

1、版本选择 本地部署就是自己部署deepseek模型&#xff0c;使用本地的算力。 主要瓶颈&#xff1a;内存显存的大小。特点&#xff1a;此方案不用联网。适合&#xff1a;有数据隐私方面担忧的或者保密单位根本就不能上网的。 2、部署过程 比较流行的是使用ollama&#xff1a;ht…...

便利店商品推荐数字大屏:基于python和streamlit

基于python和streamlit实现的便利店商品推荐大屏&#xff0c;针对选择困难症消费者。 import streamlit as st import pandas as pd import numpy as np import altair as alt from datetime import datetime, timedelta import time# 模拟数据生成 def generate_data():np.ra…...

机器视觉工程师红外相机的选择:红外长波工业相机和短波红外工业相机玄机大总结

红外长波(LWIR)和短波(SWIR)工业相机在原理、应用场景和技术特点上有显著差异。以下是它们的对比分析: 1. 波长范围与成像原理 2. 技术特点 3. 典型应用场景 4. 优缺点对比 LWIR优势: 无需光照,适用于完全黑暗环境。 直接反映物体温度分布。 对烟雾、灰尘穿透能力强。…...

AI重构SEO关键词布局

内容概要 在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;AI技术的深度应用正在颠覆传统关键词布局逻辑。通过机器学习算法与语义分析模型&#xff0c;智能系统能够实时解析海量搜索数据&#xff0c;构建动态词库并精准捕捉用户意图。相较于依赖人工经验的关键词筛…...

c语言经典基础编程题

c语言经典基础编程题 一、输出输出1.1温度输出1.2排齐数据1.3进制转换 二、选择分支2.1求最大值2.2成绩评定2.3分段函数求值2.4 利润计算2.5判断闰年2.6二次方程根 三、循环结构3.1倒数求和3.2最大数3.3判断素数3.4判断完全数3.5打印菱形&#x1f680;&#x1f680;&#x1f68…...

【每日学点HarmonyOS Next知识】防截屏、作用域问题、观察器问题、对话框关闭、判断对象包含某个字段

1、HarmonyOS 防截屏功能如何实现&#xff1f; 防截屏功能如何实现 参考demo&#xff1a; aboutToDisappear(): void {let windowClass: window.Window | undefined undefined;window.getLastWindow(getContext(this)).then((win) > {this.window win }) window.getLas…...

linux操作系统实战

第一题 创建根目录结构中的所有的普通文件 [rootlocalhost ~]# cd /[rootlocalhost /]# mkdir /text[rootlocalhost /]# cd /text[rootlocalhost text]# mkdir /text/boot /text/root /text/home /text/bin /text/sbin /text/lib /text/lib64 /text/usr /text/opt /text/etc /…...

MKS HA-MFV:半导体制造中的高精度流量验证技术解析

引言 在半导体先进制程&#xff08;如3nm节点&#xff09;中&#xff0c;工艺气体流量的精准控制直接决定刻蚀、沉积等关键步骤的均匀性和良率。MKS Instruments推出的 HA-MFV&#xff08;High Accuracy Mass Flow Verifier&#xff09; 通过创新设计解决了传统流量验证技术的…...

图论part2|200. 岛屿数量、695. 岛屿的最大面积

200、岛屿数量 &#x1f517;&#xff1a;200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09;思路&#xff1a; 1. 深度优先算法 二叉树中dfs要素&#xff1a;1、访问左右相邻子节点 2、判断base case&#xff08;终止条件&#xff09;参考二叉树中的dfs看网格问题1. 网格…...

小白学Agent技术[5](Agent框架)

文章目录 Agent框架Single Agent框架BabyAGIAutoGPTHuggingGPTHuggingGPT工作原理说明GPT-EngineerAppAgentOS-Copilot Multi-Agent框架斯坦福虚拟小镇TaskWeaverMetaGPT微软UFOAgentScope现状 常见Agent项目比较概述技术规格和能力实际应用案例开发体验比较ChatChain模式 Agen…...

SpringBoot为什么流行以及能解决什么问题?

Spring Boot 之所以流行&#xff0c;主要是因为它极大地简化了 Spring 应用的开发&#xff0c;提供了一种开箱即用的体验&#xff0c;使开发者能够快速构建独立运行的、生产级的 Spring 应用。 Spring Boot 为什么流行&#xff1f; 简化配置 传统 Spring 需要大量 XML 或 Java…...

MySQL -- 数据类型

1、数据库的基础数据类型 TINYINT INT BIGINT FLOAT DECIMAL CHAR VARCHAR TEXT BLOB DATE DATETIME TIMESTAMP SET ENUM 2、不同数据类型区别以及作用 1、数值类型 1.1 整数类型 1.1.1 TINYINT 这里我们以TINYINT这个类型为例&#xff0c;解释一下在mysql中…...

TypeScript 中 interface 与 type的使用注意事项 及区别详细介绍

interfact 与 type 的区别及使用方法 一、 interfact 与 type主要区别 二、 interfact 与 type具体用法 1. 定义对象类型 interface 的典型用法&#xff1a; interface Person {name: string;age: number;greet(): void; }type 的等效定义&#xff1a; type Person {name…...

使用位运算如何找到数组中只出现一次的数?

题目链接&#xff1a;137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 算法解析 位运算是用于二进制的运算符号。而对于多次出现的数字&#xff0c;其二进制都是一模一样的&#xff0c;这里是3次重复的出现是数字。由此我们可以想到&#xff0c;如果我们由低…...

复变函数摘记1

复变函数摘记1 1. 基本概念1.1 复数、复变函数1.2 复变函数的极限、连续性1.3 复变函数的导数、微分1.4 解析函数、柯西-黎曼方程 2. 复变函数的积分2.1 复变函数的曲线积分2.2 柯西-古萨基本定理、复合闭路定理2.3 复变函数的不定积分2.4 柯西积分公式、高阶导数 \quad 本文摘…...

(2025|ICLR|厦大华为,LoSA,基于表示互信息的动态层级稀疏率,基于重构误差的秩分配)LLM 的动态低秩稀疏自适应

Dynamic Low-Rank Sparse Adaptation for Large Language Models 目录 1. 引言 1.1 关键词 2. 方法 2.1 预备知识 2.2 层级稀疏率确定 2.3 稀疏感知的秩分配 2.4 动态稀疏与适配 3. 实验 3.1 实验设置 3.2 语言建模 3.3 零样本任务 3.4 N:M 稀疏性 3.5 消融实验 …...

暨南大学智科人工智能复试模拟

本人初试统招线以外&#xff0c;复试逆袭上岸&#xff01;&#xff01;&#xff01;复试中的笔试和面试尤为重要&#xff0c;笔试固然重要但是面试的不确定性更强。另外&#xff0c;很多同学在复试之前可能都没有完整的走过一遍复试面试的流程&#xff0c;这里建议大家最好是能…...

编译器视角下的 C++ 异常:探究 throw 与 catch 的编译原理

目录 0.写在前面 1.C异常概念 异常的定义&#xff1a; 异常处理的基本组成部分&#xff1a; 1. throw表达式 2. try块 3. catch块 2. 异常的使用 异常的抛出和匹配原则&#xff1a; 在函数调用链中异常栈展开匹配原则&#xff1a; 3.异常的重新抛出 4.异常安全 异…...

测试淘宝评论接口返回数据的详细说明

在电商数据分析、用户体验优化和竞品分析中&#xff0c;获取商品评论数据是一项重要的功能。淘宝开放平台提供了商品评论的 API 接口&#xff0c;允许开发者通过合法的方式获取商品的用户评论数据。本文将详细介绍如何测试淘宝评论接口的返回数据&#xff0c;包括接口调用步骤、…...

【微知】plantuml在泳道图中如何将几个步骤放入一个框中?(group “sub框1“; end !! “sub框1“)

背景 将几个步骤放在一起画个框&#xff0c;分区方便 命令 用法&#xff1a; group 和 end 关键字 用法&#xff1a; group "sub框1"User -> User: 模板渲染User -> User: 返回 HTMLend !! "sub框1" 这里!!是注释实操 修改前&#xff1a; 修改…...

深入解析 React 最新特性:革新、应用与最佳实践

深入解析 React 最新特性&#xff1a;革新、应用与最佳实践 1. 引言 React 作为前端开发的核心技术之一&#xff0c;近年来不断推出 新的 API 和优化机制&#xff0c;从 Concurrent Rendering&#xff08;并发模式&#xff09; 到 Server Components&#xff08;服务器组件&a…...

C语言之数据结构:理解什么是数据结构和算法(启航)

引言 启航篇&#xff0c;理解什么是数据结构和算法 在 C 语言编程领域&#xff0c;数据结构和算法是两个核心且紧密相关的概念 一、数据结构 定义 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合&#xff08;比如数组&#xff09;&#xff0c;它是组织和存储数…...

【21】单片机编程核心技巧:if语句逻辑与真假判断

【21】单片机编程核心技巧&#xff1a;if语句逻辑与真假判断 七律 条件分野 if语句判真假&#xff0c;括号条件定乾坤。 非零为真零为假&#xff0c;大括号内藏玄门。 省略虽简风险在&#xff0c;代码规范护本根。 单片逻辑由心控&#xff0c;条件分支自成文。 注释&#xf…...

hackme靶机通关攻略

第一步&#xff1a;确定靶机IP 第二步&#xff1a;使用御剑后台扫描工具扫描敏感文件 第三步&#xff1a;访问register.php注册登录&#xff0c;进入welcome.php页面 第四步&#xff1a;访问一个不存在的页面&#xff0c;确定网站使用的中间件是Apache&#xff08;无用&#xf…...

网络安全演练有哪些形式

OPENVAS使用 1、确定指定IP是否能ping通 2、创建扫描目标 3、创建扫描任务&#xff08;scan management →newtask&#xff09; 4、开始任务start 5、查看扫描细节 6、查看扫描结果&#xff0c;包含漏洞详细信息&#xff0c;亦可到处PDF文件 7、导出扫描结果报告 8、为…...

PE,ELF,COFF

本文来自 (1)腾讯元宝 (2)程序员的自我修养 PE&#xff08;Portable Executable&#xff09;是一种文件格式&#xff0c;主要用于Windows操作系统中的可执行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系统中标准的可执行文件格式&#xff0c;由…...

sql靶场-时间盲注(第九、十关)保姆级教程

目录 时间盲注&#xff08;第九、十关&#xff09; 1.判断 2.确认时间盲注 2.手工尝试时间盲注 数据库名长度 数据库名字符 表数 表名长度 表名字符 字段数 字段名长度 字段名字符 4.脚本时间盲注注入 5.第十关 时间盲注&#xff08;第九、十关&#xff09; 1.判…...

常见FUZZ姿势与工具实战:从未知目录到备份文件漏洞挖掘

本文仅供学习交流使用&#xff0c;严禁用于非法用途。未经授权&#xff0c;禁止对任何网站或系统进行未授权的测试或攻击。因使用本文所述技术造成的任何后果&#xff0c;由使用者自行承担。请严格遵守《网络安全法》及相关法律法规&#xff01; 目录 本文仅供学习交流使用&am…...

【linux】解决 Linux 系统中 root 用户无法打开图形界面问题

【linux】解决 Linux 系统中 root 用户无法打开图形界面问题 问题描述&#xff1a; 在 Linux 系统中&#xff0c;当我们远程SSH尝试以 root 用户身份运行需要图形界面的应用程序时&#xff0c;可能会遇到以下错误信息&#xff1a; MoTTY X11 proxy: Unsupported authorisati…...

数据库系统概念全面解析

数据库系统可能看起来很抽象&#xff0c;但其实它们就像我们生活中的许多事物一样&#xff0c;有着清晰的结构和规则。让我们通过一些有趣的生活例子来理解这些概念。 一、数据库系统基础 想象一个图书馆&#xff1a; - 数据库管理系统(DBMS) 就像图书馆的管理员 - 数据库(DB…...

unity Rigidbody2D、Collider2D参数详解

Rigidbody2D属性&#xff1a; BodyType&#xff1a;类别Simulated&#xff1a;模拟&#xff0c;是否模拟真实物理效果。Use Auto Mass&#xff1a;使用自动质量&#xff0c;根据BoxCollider2D大小来设定Mass&#xff1a;质量。Linear Drag&#xff1a;影响位置移动的阻力系数An…...

es-索引详解

在 Elasticsearch 中&#xff0c;**索引&#xff08;Index&#xff09;**是核心概念之一&#xff0c;类似于关系型数据库中的“表”。索引用于存储、组织和检索文档&#xff08;Document&#xff09;。以下是关于 Elasticsearch 索引的详细解析&#xff1a; 1. 索引的基本概念 …...

SpringBoot3+Lombok如何配置logback输出日志到文件

Background/Requirement SpringBoot3Lombok如何配置logback输出日志到文件&#xff0c;因为我需要对这些日志进行输出&#xff0c;控制台输出和文件输出&#xff0c;文件输出是为了更好的作为AuditLog且支持滚动式备份&#xff0c;每天一个文件。 Technical Solution 1.确保你…...

城市客运安全员适合哪几类人报考

城市客运安全员适合以下几类人报考&#xff1a; 相关专业人员&#xff1a;交通工程、安全工程、交通运输管理等相关专业的人员&#xff0c;他们在学校系统学习过交通安全、运输管理、安全管理等方面的知识&#xff0c;具备扎实的理论基础&#xff0c;更容易理解和掌握城市客运…...

Elasticsearch 解析 updateTime 字段时格式错误

遇到的问题: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse field [updateTime] of type [date] in document with id 57"}],"type":"mapper_parsing…...

Windows远程桌面黑屏怎么办?

在使用Windows远程桌面连接另一台电脑时&#xff0c;用户经常会遇到Windows远程桌面黑屏的问题。那么&#xff0c;该如何有效地解决Windows远程桌面黑屏的问题呢&#xff1f;遇到远程桌面连接黑屏的问题时&#xff0c;可以通过在本地组策略编辑器中禁用WDDM图形显示驱动来解决。…...