深入理解 QObject的作用
QObject 作为 Qt 库中所有对象的基类,其地位无可替代。几乎 Qt 框架内的每一个类,无论是负责构建用户界面的 QWidget,还是专注于数据处理与呈现的 QAbstractItemModel,均直接或间接继承自 QObject。这种继承体系赋予 Qt 类库高度的一致性和可扩展性,使得开发者能够基于统一的接口和特性进行开发,极大地提高了开发效率和代码的可读性。
从底层实现来看,QObject 内部维护了一套元数据结构,记录了对象的各种信息,包括属性、信号、槽以及对象间的关系等。这些元数据不仅是 QObject 实现各种功能的基础,也为整个 Qt 框架提供了强大的运行时反射能力。
信号与槽:对象间通信的桥梁
信号与槽机制是 QObject 最具特色的功能之一,也是 Qt 区别于其他开发框架的重要标志。这一机制彻底改变了传统编程中对象间通信的方式,以一种更加优雅、灵活且低耦合的方式实现了对象间的交互。
在传统编程模式下,对象之间的通信往往依赖于复杂的回调函数或者共享状态变量。回调函数虽然能够实现基本的通信功能,但随着项目规模的扩大,回调函数的管理和维护变得愈发困难,代码的可读性和可维护性急剧下降。而共享状态变量则容易引发数据竞争和线程安全问题,增加了开发的复杂性。
Qt 的信号与槽机制则巧妙地解决了这些问题。当一个 QObject 对象的某个特定事件发生时,它会发射一个信号(signal)。这个信号就像是一个广播通知,告知其他对象:“我这里发生了一件事情!” 而其他对象可以通过连接(connect)这个信号,将其与自身的一个槽函数(slot)关联起来。当信号被发射时,与之连接的槽函数会自动被调用,从而实现了对象之间的通信。
信号与槽机制的实现依赖于 Qt 的元对象系统(Meta-Object System)。在编译阶段,Qt 的元对象编译器(MOC,Meta-Object Compiler)会扫描包含 Q_OBJECT 宏的类定义,生成额外的代码来支持信号与槽功能。这些生成的代码包含了信号和槽的映射表,以及用于信号发射和槽调用的底层逻辑。在运行时,当信号被发射时,Qt 会根据映射表找到与之连接的槽函数,并调用相应的函数。
以一个简单的图形界面应用为例,当用户点击一个按钮时,按钮对象会发射一个 clicked 信号。我们可以将这个信号连接到一个槽函数上,在槽函数中执行相应的操作,比如打开一个新的窗口、保存文件或者更新界面显示等。这种机制使得代码的逻辑更加清晰,对象之间的依赖关系更加松散,大大提高了代码的可维护性和可扩展性。
此外,Qt5 引入了新的信号与槽连接语法,使得连接操作更加直观且类型安全。新语法使用函数指针来指定信号和槽,避免了传统字符串连接方式可能出现的拼写错误和类型不匹配问题。同时,信号还可以连接到其他信号,实现信号的转发和组合;槽函数也可以接收来自多个信号的触发,为复杂的事件处理逻辑提供了更大的灵活性。
对象树:管理对象生命周期的利器
QObject 支持对象树结构,这是一种非常强大且高效的对象管理方式。在对象树中,一个 QObject 对象可以作为父对象,拥有零个或多个子对象。这种父子关系构成了一个树形结构,使得对象之间的层次关系一目了然。
当父对象被销毁时,它的所有子对象也会自动被销毁。这一特性极大地简化了对象的内存管理,避免了手动管理对象生命周期可能带来的内存泄漏和悬空指针等问题。例如,在一个窗口应用中,窗口对象可以作为父对象,包含各种子控件,如按钮、文本框、标签等。当窗口关闭时,窗口对象被销毁,同时它的所有子控件也会被自动销毁,开发者无需手动编写代码来管理这些子控件的内存释放。
从实现原理上讲,QObject 类内部维护了一个 QList<QObject *> 类型的私有变量,用于存储它的所有子对象。当一个 QObject 对象被创建并指定父对象时,它会自动将自己添加到父对象的子对象列表中。在父对象析构时,会遍历这个子对象列表,依次销毁每个子对象。
对象树结构不仅简化了内存管理,还使得对象之间的关系更加紧密和有序。通过父对象,我们可以方便地访问和管理它的所有子对象;通过子对象,也可以快速找到它的父对象。这种层次化的管理方式在处理复杂的应用场景时非常有用,例如在构建大型用户界面时,可以通过对象树快速定位和操作特定的控件。
内存管理:自动与高效
基于对象树结构,QObject 实现了一套高效的自动内存管理机制。如前文所述,当父对象被销毁时,子对象会自动被销毁,这确保了内存的正确释放,减少了因手动内存管理不当而导致的内存泄漏和悬空指针等问题。
对于没有父对象的 QObject,它自身负责管理销毁。开发者可以通过 deleteLater () 函数来延迟对象的销毁。这个函数会将对象的销毁操作推迟到当前事件循环结束之后,这在一些需要在当前事件处理完成后再销毁对象的场景中非常实用。例如,在一个正在进行数据处理的线程中,如果需要销毁一个与该线程相关的 QObject 对象,直接调用 delete 可能会导致线程安全问题,而使用 deleteLater () 函数则可以确保对象在安全的时机被销毁。
此外,Qt 还提供了智能指针类,如 QScopedPointer 和 QSharedPointer,用于辅助管理对象的生命周期。QScopedPointer 是一种基于作用域的智能指针,当它超出作用域时,所指向的对象会被自动删除。QSharedPointer 则是一种共享所有权的智能指针,多个 QSharedPointer 可以指向同一个对象,通过引用计数来管理对象的生命周期,当最后一个指向对象的 QSharedPointer 被销毁时,对象才会被真正删除。这些智能指针与 QObject 的对象树机制相结合,为开发者提供了更加灵活和安全的内存管理方式。
元对象系统:赋予 Qt 动态能力
QObject 支持 Qt 的元对象系统,这是一个功能强大且高度抽象的系统,为 Qt 框架赋予了丰富的动态特性。元对象系统通过使用 Q_OBJECT 宏来启用,它提供了运行时类型信息(RTTI,Run-Time Type Information)和反射能力,使得开发者可以在运行时查询和操作对象的属性、信号和槽。
在编译阶段,MOC 会为每个包含 Q_OBJECT 宏的类生成一个元对象代码文件。这个文件包含了类的元对象信息,如类名、属性列表、信号列表、槽列表等。在运行时,通过 QObject 的 metaObject () 函数可以获取到对象的元对象,进而通过元对象提供的接口来查询和操作对象的各种信息。
例如,我们可以通过元对象系统动态地获取一个对象的所有属性,并对其进行设置和获取。在设计一些通用的组件或者框架时,这种动态特性可以大大提高代码的灵活性和通用性。假设我们有一个通用的表格组件,需要根据不同的业务需求动态地设置表格的列属性,如列名、列宽、数据类型等。通过元对象系统,我们可以在运行时根据配置信息动态地获取和设置表格对象的属性,而无需在编译时就确定所有的属性值。
此外,元对象系统还支持信号与槽的动态连接。在运行时,我们可以根据条件动态地连接和断开信号与槽,这为实现一些动态交互的功能提供了可能。例如,在一个多页面的应用中,不同页面之间可能需要根据用户的操作动态地建立和断开信号与槽的连接,以实现页面间的灵活通信。
事件处理:响应外部交互
QObject 是 Qt 事件处理机制的核心。它可以接收和处理各种事件,如鼠标点击、键盘输入、定时器事件、绘制事件等。Qt 的事件处理机制基于事件循环(Event Loop),应用程序在运行时会不断地从事件队列中获取事件,并将其分发给相应的 QObject 对象进行处理。
开发者可以通过重写 event () 函数或者特定的事件处理函数,来实现对事件的自定义处理。event () 函数是 QObject 的一个虚函数,它接收一个 QEvent 对象作为参数,负责处理所有类型的事件。在 event () 函数中,会根据事件的类型调用相应的特定事件处理函数,如 mousePressEvent ()、keyPressEvent ()、timerEvent () 等。
以处理鼠标点击事件为例,我们可以重写 QWidget 的 mousePressEvent () 函数,在函数中实现我们想要的交互逻辑,比如绘制图形、移动窗口、弹出菜单等。当用户在界面上点击鼠标时,鼠标点击事件会被发送到对应的 QWidget 对象,然后调用其 mousePressEvent () 函数进行处理。
此外,QObject 还支持事件过滤器(Event Filter)机制。通过设置事件过滤器,一个 QObject 可以监视并处理其他 QObject 的事件,而无需修改被监视对象的代码。这一特性在需要为多个对象添加统一的事件处理逻辑时非常有用,例如在一个应用中,我们可能需要为所有的窗口添加一个全局的鼠标右键菜单,通过事件过滤器可以方便地实现这一功能。
QObject 的基础成员函数
QObject 除了上述强大的功能体系外,还提供了众多基础且实用的成员函数,这些函数如同基石,支撑着各类复杂功能的实现。
对象身份识别
objectName()和setObjectName(const QString &name)这对函数用于获取和设置对象的名称。在复杂的应用程序中,为对象设置唯一的名称便于在对象树中进行查找和管理。例如,在一个包含众多控件的用户界面中,通过给每个控件设置独特的objectName,就可以使用QObject::findChild或QObject::findChildren函数依据名称快速定位到特定的控件,进行属性修改、事件连接等操作 ,极大地提高了代码操作对象的便捷性。
父子关系管理
parent()函数用于获取对象的父对象,而setParent(QObject *parent)函数则用于设置对象的父对象,这在构建和维护对象树结构时起到关键作用。开发者可以通过这些函数动态地改变对象在对象树中的位置,比如将一个临时创建的提示框对象设置为某个特定窗口的子对象,当该窗口关闭时,提示框也能随之自动销毁,确保内存管理的一致性和正确性。
属性操作
setProperty(const char *name, const QVariant &value)和property(const char *name) const函数用于设置和获取对象的属性。借助 Qt 的元对象系统,对象的属性可以在运行时被动态地修改和查询。例如,在开发一个可定制界面风格的应用时,可以通过setProperty函数根据用户的选择来设置窗口的背景颜色、字体大小等属性,再通过property函数获取当前属性值用于显示或保存配置,增强了应用的灵活性和用户可定制性。
事件相关
installEventFilter(QObject *filterObj)和removeEventFilter(QObject *filterObj)函数用于安装和移除事件过滤器。事件过滤器允许一个对象拦截并处理其他对象的事件,通过这两个函数,开发者可以灵活地控制事件的流向和处理方式。比如在一个大型项目中,为了统一处理所有窗口的鼠标滚轮事件,创建一个专门的事件过滤器对象,并通过installEventFilter将其安装到各个窗口对象上,集中处理滚轮事件,避免在每个窗口类中重复编写事件处理代码。
这些基础成员函数虽然看似简单,但它们是 QObject 功能体系的重要组成部分,在日常开发中被频繁使用,为开发者提供了高效操作对象、管理对象关系以及定制对象行为的能力。
为什么要有 QObject
从上述深入剖析的功能可以看出,QObject 在 Qt 中扮演着至关重要的角色。它是 Qt 框架的灵魂和核心,为开发者提供了一整套丰富而强大的工具和机制,使得开发 Qt 应用变得更加高效、便捷和可靠。
如果没有 QObject,Qt 的对象系统将缺乏统一的基础,各种功能将难以实现。信号与槽机制将无法存在,对象之间的通信将变得繁琐和复杂,代码的耦合度将大大提高,维护和扩展将变得异常困难。对象树结构和自动内存管理将无从谈起,开发者需要花费大量的精力来手动管理对象的生命周期,容易出现内存泄漏和悬空指针等问题,降低了应用程序的稳定性和可靠性。元对象系统和事件处理机制也将无法实现,Qt 的动态特性和交互能力将大打折扣,无法满足现代应用开发对于灵活性和交互性的要求。
QObject 是 Qt 成为一个功能强大、易于使用的跨平台应用开发框架的关键所在。无论是开发桌面应用、移动应用还是嵌入式应用,深入理解和掌握 QObject 的使用方法和原理,都是每一位 Qt 开发者的必修课。只有熟练运用 QObject 提供的各种功能,才能充分发挥 Qt 框架的优势,构建出高质量、高性能的应用程序。
相关文章:
深入理解 QObject的作用
QObject 作为 Qt 库中所有对象的基类,其地位无可替代。几乎 Qt 框架内的每一个类,无论是负责构建用户界面的 QWidget,还是专注于数据处理与呈现的 QAbstractItemModel,均直接或间接继承自 QObject。这种继承体系赋予 Qt 类库高度的…...
解码 NLP:从萌芽到蓬勃的技术蜕变之旅
内容概况: 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。课程强调实践为主、理论为辅的学习方法,并通过多个生活场景展示了NLP技术的实际应用,如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…...
【核心算法篇十五】《深度解析DeepSeek遗传算法:让超参数调优从“玄学”变“科学”的终极指南》
引言:超参数调优的“炼丹困局”与破局之路 在机器学习的世界里,调参工程师常被戏称为"炼丹师"——面对动辄几十个超参数的复杂模型,我们就像古代术士守着炼丹炉,不断尝试各种参数组合,期待偶然炼出"仙丹"。传统网格搜索(Grid Search)需要遍历所有可…...
Python—变量、基本数据类型、类型的转换
文章目录 Python—变量、基本数据类型1 格式化输出2 号的使用3 变量的数据类型4 type() 函数的使用5 数据类型的基本介绍5.1 int 整型5.2 float 浮点类型5.3 bool 布尔类型5.4 str 字符串类型5.5 字符串驻留机制5.6 数据类型的转换(1)隐式转换ÿ…...
启明星辰规则库下载
启明星辰规则库下载 一、脚本介绍 1、背景介绍 因为项目上有启明星辰的安全设备、并且在内网无法直接连接互联网进行在线升级,必须使用离线升级模式,下载规则库升级,每月一更有点繁琐,所以写了这个b脚本,偷懒一下&a…...
uniapp 拖拽排序
1.拖拽排序 使用 sortablejs库 npm install sortablejs --save-dev <template><view id"list"><view v-for"(item, index) in list" :key"item.id" class"item">{{ item.name }}</view></view> </t…...
测试。。。
移动到中位数位置能保证总移动距离最小,数学知识 #include <iostream> #include <vector> #include <cmath> using namespace std;int main() {int n;string s;cin >> n >> s;vector<int> positions;// 记录所有1的位置for (…...
Java常用设计模式及其应用场景
1. 什么是设计模式? 设计模式是一个经过多次验证的、针对常见问题的可复用解决方案。设计模式并不是具体的代码实现,而是给出了如何解决问题的思路和结构。在实际开发过程中,设计模式有助于开发者快速找到合适的解决方案,从而减少…...
2000字,极简版华为数字化转型方法论
作为国内科技行业的领军者,华为的成功经验为众多企业提供了宝贵的借鉴。本文将围绕准备、规划和执行三个阶段展开,结合华为的实践案例,深入剖析其数字化转型的方法论,希望能为您的企业数字化转型提供有益的参考。 一、数字化转型…...
Ubuntu:20.04更新cmake到更高版本
从输出信息可以看出,您当前的系统中已经安装了 cmake,但版本是 3.16.3,而您的项目需要 CMake 3.18 或更高版本。默认情况下,Ubuntu 20.04 的官方软件仓库中提供的 CMake 版本较低(如 3.16.3),因…...
【SpringBoot教程】Spring Boot + MySQL + Druid连接池整合教程
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 前面毛毛张介绍过HikariCP连接池,今天毛毛张来介绍一下Druid连接池,SpringBoot 2.0以上默认使用HikariCP数据源,但是也要学会使用…...
基于SpringBoot实现的宠物领养系统平台功能一
一、前言介绍: 1.1 项目摘要 宠物领养需求增加:随着人们生活水平的提高和对宠物养护意识的增强,越来越多的人选择领养宠物作为家庭的一员。这导致了宠物领养需求的显著增加。 传统领养方式存在问题:传统的宠物领养方式…...
【DeepSeek 学C++】std::atomic 用于线程控制,和内存强顺序一致性
std::atomic<bool> workerTerminate_{}; std::atomic<bool> workerTerminate_{}; 是一个原子布尔变量的声明,变量名为 workerTerminate_。这种变量通常用于多线程编程中,用来控制或通知工作线程的终止。使用 std::atomic 可以确保对该变量的…...
计算存储一幅大小为 1024×10241024×1024、256 灰度级的图像所需的字节数
1. 图像的基本信息 图像分辨率:1024102410241024,表示图像有 1024 行和 1024 列,总像素数为: 102410241,048,576 像素102410241,048,576 像素 灰度级:256 灰度级,表示每个像素的灰度值可以用 256 个不同的值…...
Flutter 网络请求与数据处理:从基础到单例封装
Flutter 网络请求与数据处理:从基础到单例封装 在 Flutter 开发中,网络请求是一个非常常见的需求,比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理,我们需要选择合适的工具并进行合理的封装。 …...
从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用
嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下,传统的视频观看方式依赖于微软的OCX控件,然而OCX控件的使用正面临越来越多的挑战: 首先,用户需要安装浏览器插件、调整浏览器安全级别,并允许ActiveX控件弹出…...
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300的秘密武器
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 企业级应用开发的需求日益增长。今天,我们要介绍的是一个在GitHub上广受好评的开源项目——Jeesite5。这不仅是一个技术框架,更…...
C++(23):lambda可以省略()
C越来越多的使用了lambda,C23也进一步的放宽了对lambda的限制,这一次,如果lambda没有参数列表,那么可以直接省略掉(): #include <iostream> using namespace std;void func() {auto f []{cout<<"in…...
vue3之echarts柱状图-圆锥加自动轮播
vue3之echarts柱状图-圆锥加自动轮播 效果: 版本 "echarts": "5.4.2" 核心代码: <template><div ref"echartRef" class"chart"></div><svg><linearGradient v-for"(item, i…...
Qt中利用httplib调用https接口
httplib中如果要调用https接口,需要开启OPENSSL支持,经过半天坑爹得摸索,总结下经验。 1,下载 并安装Win64OpenSSL 地址如下,我Qt版本是5.15.2 ,openssl选择的是 64位(Win64OpenSSL-3_3_3.msi…...
深度学习04 数据增强、调整学习率
目录 数据增强 常用的数据增强方法 调整学习率 学习率 调整学习率 调整学习率的方法 有序调整 等间隔调整 多间隔调整 指数衰减 余弦退火 自适应调整 自定义调整 数据增强 数据增强是通过对训练数据进行各种变换(如旋转、翻转、裁剪等)&am…...
卷积神经网络之AlexNet经典神经网络,实现手写数字0~9识别
深度学习中较为常见的神经网络模型AlexNet,AlexNet 是一个采用 GPU 训练的深层 CNN,本质是种 LeNet 变体。由特征提取层的5个卷积层两个下采样层和分类器中的三个全连接层构成。 先看原理: AlexNet网络特点 采用 ReLU 激活函数,…...
建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11
这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…...
全球化趋势下中资企业出海投资及合规运营实战分享
企业全球化布局需构建“战略-架构-合规-运营”四位一体体系,通过灵活的投资架构、精准的税务规划、本土化运营和ESG融合,实现风险可控的海外扩张。核心策略包括: 供应链多节点布局(至少3个国家备份产能);融…...
2025-2-19 leetcode刷题情况(二叉树)
一、226.翻转二叉树 1.题目描述 给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点 2.代码 3.思路 递归遍历(DFS)交换每个节点的左 / 右子节点,即可生成二叉树的镜像。 递归解析: 终止条件&a…...
Linux常见命令
文件和目录操作命令 cd:用于切换目录。例如,cd /home/user 可进入 /home/user 目录;cd.. 可返回上一级目录。ls:用于列出目录内容。ls 直接列出当前目录下的文件和文件夹;ls -l 以详细列表形式显示;ls -a 显…...
C++ 一篇读懂“值传递”和“地址传递”
让我们通过一个简单的、形象的比喻来帮助你理解“值传递”和“地址传递”是如何影响实参的。 1. 值传递 想象你有一个 **信封**(代表变量),里面放着一张纸条(代表数据)。你决定把这个信封寄给一个朋友,让他…...
我用AI做数据分析之数据清洗
我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样? 这里描述自己在使用AI进行数据分析(数据清洗)过程中的几个小故事: 1. 变量名的翻译 有一个项目是某医生自己收集的数据,变量名使用的是中文,分…...
韩国哈希散列算法DHA-256
韩国哈希散列算法DHA-256 DHA-256是在2005年11月由NIST举行的Hash研讨会(Cryptographic Hash Workshop)上提出的。DHA-256压缩函数将长度为512比特的分组,压缩成长度为256比特的串,总共迭代64步,扩展的消息字在步函数中使用了两次。 DHA-25…...
【愚公系列】《Python网络爬虫从入门到精通》022-Splash的爬虫应用
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Golang深度学习
前言 在2009年,Google公司发布了一种新的编程语言,名为Go(或称为Golang),旨在提高编程效率、简化并发编程,并提供强大的标准库支持。Go语言的设计者们希望通过Go语言能够解决软件开发中的一些长期存在的问…...
React(8)
封装评论列表的Item组件 实现父传子以及子组件调用父组件方法 import { useEffect, useState } from "react"; import "./index.css"; import _ from "lodash"; import classNames from "classnames"; import axios from "axio…...
自制AirTag,支持安卓/鸿蒙/PC/Home Assistant,无需拥有iPhone
苹果的AirTag很贵,虽然某强北有平价代替品,但是仍需要苹果设备才能绑定,才能查看位置。不支持安卓/鸿蒙/PC,也不支持集成到Home Assistant中。 AirTag 的原理 每个AirTag都会发送一个蓝牙信号,其可以被临近的苹果设备…...
docker修改镜像默认存储路径(基于页面迁移)
文章目录 1、停止服务2、拷贝镜像3、docker界面设置路径4、重新启动服务5、重启电脑 1、停止服务 桌面底部右键打开任务管理器 停止docker服务 2、拷贝镜像 从原目录拷贝到新的目录下,新的目录自己定,如果没有权限,需要先对原文件添加权限…...
10. 软件设计架构-经典架构问题
文章目录 前言一、高并发场景下的系统崩溃1. 问题描述2. 解决方案:3. 案例分析:电商秒杀系统 二、单体架构到微服务的拆分陷阱1. 问题描述2. 解决方案:3. 案例分析:在线教育平台拆分 三、分布式系统中的数据一致性难题1. 问题描述…...
Qt学习(五)自定义对话框,多窗口开发---添加设计师类, MDI多窗口开发
一 对话框 实现功能:打开文件,选择目录,保存文件,选择颜色,选择字体,输入信息, 消息提示框 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE na…...
【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》
“谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!” 本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法…...
深入浅出CSS复合选择器:掌控元素关系与层级选择
目录 前言 一、子代选择器(Descendant Selector) 1. 什么是子代选择器? 2. 基本语法 3. 示例 4. 注意事项 二、直接子元素选择器(Child Selector) 1. 什么是直接子元素选择器? 2. 基本语法 3. 示例…...
LLM 推理中推理-时间计算技巧
25年2月来自香港科技大学广州分校的论文“Bag of Tricks for Inference-time Computation of LLM Reasoning”。 随着大语言模型 (LLM) 的进步,解决复杂的推理任务越来越受到关注。推理-时间计算方法(例如 Best-of-N、波束搜索等)特别有价值…...
【模板】图论 最短路 (Floyd+SPFA+Dijkstra)
FloydSPFADijkstra 温故而知新,这三种算法都是求最短路问题常用的算法(特别是Dijkstra) 1.Floyd (多源最短路) 基于动态规划思想,时间复杂度为 O ( N 3 ) O(N^3) O(N3) 较高。 注意点: 初始化距离为INF…...
vite-vue-ts使用arco-design-vue定制主题的后动态变更主题思路
定制主题的后动态变更主题思路 安装依赖与主题定制动态变更主题过程尝试修改主题色(结果失败)尝试修改主题色(结果成功,但是hover的主题色没有变,未覆盖10个梯度的色值)根据主题色实现10个梯度颜色实现10个…...
递归爬取网页测试
我们正在做基于大模型的数据分析平台。 当前需要测试ezdata的递归爬取功能,爬取到第几层 测试网址 https://blog.csdn.net/m0_68177611/article/details/144936089...
【论文学习】RVS-FDSC:一种基于四方向条带卷积的视网膜血管分割方法以增强特征提取
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论文论文内容RSC模块MSPF2 模块RPDA模块 实验效果 总结互动致谢参考往期回顾 前言…...
交友项目-交友软件简介
一、 项目背景 在线社交是互联网时代的产物,已成为互联网用户的基础需求之一。移动互联网自2003年起快速发展,促使在线社交逐渐从PC端转移至移动端。移动社交最初以熟人社交为主,以维系熟人关系、共享资源信息的形式存在。随着人们交友需求的…...
新手向:SpringBoot后端查询到数据,前端404?(附联调时各传参方式注解总结-带你一文搞定联调参数)
前言: 在 Spring Boot 项目开发中,后端小伙伴可能经常遇到这样诡异的场景: 后台日志显示查询到了数据,但前端却一脸懵逼地告诉你 404 Not Found?接口明明写好了,Postman 直接访问却提示找不到?…...
Elasticsearch7.6.2 安装过程
一. 安装JDK1.8 (1)创建安装目录 mkdir /usr/local/java/ (2)解压至安装目录 tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local/java/ (3)设置环境变量 vim /etc/profile 在末尾添加 export JA…...
汇能感知的光谱相机/模块产品有哪些?
CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…...
【机器学习】K折交叉验证(K-Fold Cross-Validation)
文章目录 K折交叉验证步骤详解一. 核心目标二. 具体步骤与操作三. 关键变体与场景适配3.1 分层K折交叉验证3.2 时间序列K折交叉验证3.3 留一法(LOO)3.4 重复K折交叉验证 四. 实践注意事项五. Python代码示例六. 总结 K折交叉验证步骤详解 一. 核心目标 …...
【核心算法篇十九】《 DeepSeek因果推断:双重差分模型如何破解政策评估的「时空难题」》
一、当AB实验不可行时,我们该相信什么?(因果推断困局解析) 假设某城市推出「夜间地铁免费」政策,市长想知道这个政策是否真的提升了夜间经济。这时候你会发现: 1️⃣ 无法克隆城市:不能同时存在一个「实施政策」和「不实施政策」的平行宇宙 2️⃣ 数据混杂严重:疫情反…...
使用vue3框架vue-next-admin导出列表数据
在 Vue3 中实现 Excel 导出功能可以通过以下步骤完成,这里使用 xlsx 库来实现前端 Excel 导出: 1. 安装依赖 npm install xlsx file-saver # 或 yarn add xlsx file-saver2. 实现代码示例 需要在当前页引入 import * as XLSX from "xlsx";注…...