Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)
- 前言
- 一. 信号槽的误用导致崩溃的常见原因
- 1.信号和槽连接的对象被提前释放
- 案例
- 解决方法
- 2.参数类型不匹配
- 案例
- 解决方法
- 3. 多线程信号槽使用不当
- 案例
- 解决方法
- 4. 信号重复连接导致槽多次触发
- 案例
- 解决方法
- 5. lambda 捕获变量失效
- 案例
- 解决方法
- 6. 动态信号槽绑定的生命周期问题
- 案例
- 解决方法
- 7. 动态对象树管理失误
- 案例
- 解决方法
- 二. 防止信号槽误用的最佳实践
- 三. 总结
前言
该系列文章中,我主要和大家一同探讨因为Qt 的信号槽机制误用,而引发的 Segmentation Fault 问题。
作为自己目前经手项目的阶段性总结,同时也给大家分享几个正确使用QT信号槽的定向性方式。
在该篇内容中,我将结合 Qt 编译器的特性,详细分析信号槽使用不当可能引发的崩溃问题。
【系列文章】索引:
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)
一. 信号槽的误用导致崩溃的常见原因
1.信号和槽连接的对象被提前释放
信号和槽的连接依赖于两个对象(信号发出者和槽接受者)。如果槽的接受者(receiver
)对象被释放,信号仍然尝试调用已释放对象的槽函数,可能导致 段错误。
案例
MyDialog* dialog = new MyDialog();
QObject::connect(sender, &Sender::someSignal, dialog, &MyDialog::someSlot);
// dialog 被释放
delete dialog;
// 信号发出时尝试调用已被释放对象的槽
emit sender->someSignal(); // 崩溃
解决方法
- 使用
QObject::deleteLater()
安全释放对象:
dialog->deleteLater();
- 使用
QPointer
(弱指针)跟踪对象状态,防止调用失效对象:
QPointer<MyDialog> dialog = new MyDialog();
QObject::connect(sender, &Sender::someSignal, dialog.data(), &MyDialog::someSlot);
if (dialog) {emit sender->someSignal();
}
2.参数类型不匹配
信号和槽连接时,参数类型必须完全匹配。如果参数类型不匹配,可能会导致未定义行为,甚至引发崩溃。
案例
QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot);
// 信号定义
signals:void someSignal(int);
// 槽定义
public slots:void someSlot(QString str); // 参数类型不匹配,可能崩溃
解决方法
确保信号和槽的参数类型一致,或通过 lambda 表达式适配:
QObject::connect(sender, &Sender::someSignal, receiver, [](int value) {receiver->someSlot(QString::number(value));
});
3. 多线程信号槽使用不当
信号槽机制支持多线程通信,但不正确的连接方式可能导致线程安全问题或崩溃。
案例
- 信号和槽在不同线程中,使用
Qt::DirectConnection
(直接连接)而非Qt::QueuedConnection
(队列连接),导致槽在错误的线程中被调用。 - 在跨线程通信中,信号或槽的对象被销毁,但连接关系未正确处理。
QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot, Qt::DirectConnection);
// receiver 属于另一个线程,槽在错误线程执行,可能崩溃
emit sender->someSignal();
解决方法
- 使用
Qt::QueuedConnection
或让 Qt 自动选择连接类型(默认Qt::AutoConnection
):
QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot, Qt::QueuedConnection);
- 检查跨线程通信时的对象生命周期,确保对象未被释放。
4. 信号重复连接导致槽多次触发
如果同一个信号被重复连接到同一个槽,多次触发信号可能导致堆栈溢出或性能问题,甚至引发未定义行为。
案例
QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot);
QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot); // 重复连接
emit sender->someSignal(); // someSlot 被调用两次
解决方法
使用 Qt::UniqueConnection
确保信号与槽的唯一连接:
QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot, Qt::UniqueConnection);
5. lambda 捕获变量失效
使用 lambda 表达式作为槽时,捕获的局部变量如果在槽执行时已失效,可能导致崩溃。
案例
QObject::connect(sender, &Sender::someSignal, [=]() {QString str = localVariable; // localVariable 可能已失效
});
解决方法
确保捕获的变量生命周期有效,或捕获副本:
QString localCopy = localVariable;
QObject::connect(sender, &Sender::someSignal, [localCopy]() {qDebug() << localCopy;
});
6. 动态信号槽绑定的生命周期问题
动态信号槽绑定(如 QObject::connect
返回 QMetaObject::Connection
)时,如果不正确管理连接对象,可能导致悬挂连接。
案例
QMetaObject::Connection conn = QObject::connect(sender, &Sender::someSignal, receiver, &Receiver::someSlot);
// 未正确断开连接
receiver->deleteLater();
emit sender->someSignal(); // 崩溃
解决方法
在对象销毁时自动断开连接:
QObject::connect(receiver, &QObject::destroyed, [conn]() {QObject::disconnect(conn);
});
7. 动态对象树管理失误
Qt 提供对象树管理功能(QObject
的父子关系)。若信号槽涉及父子对象,但未正确设置父子关系,可能导致对象被误释放。
案例
MyDialog* dialog = new MyDialog(parent);
QObject::connect(sender, &Sender::someSignal, dialog, &MyDialog::someSlot);
// 未设置 parent
delete parent; // dialog 未自动释放,信号仍尝试调用槽
emit sender->someSignal(); // 崩溃
解决方法
为动态分配的对象设置父对象,确保生命周期一致:
MyDialog* dialog = new MyDialog(this); // this 是父对象
二. 防止信号槽误用的最佳实践
-
使用新语法(类型安全)
- 避免使用旧的字符串语法,改用类型安全的新语法:
QObject::connect(sender, &Sender::signalName, receiver, &Receiver::slotName);
-
管理对象生命周期
- 使用智能指针(如
QPointer
或std::shared_ptr
)跟踪对象状态。 - 设置父子关系,确保子对象自动释放。
- 使用智能指针(如
-
跨线程通信
- 明确选择合适的连接类型(
Qt::QueuedConnection
或默认Qt::AutoConnection
)。 - 保证信号和槽所在对象的线程一致性。
- 明确选择合适的连接类型(
-
信号连接检查
- 确保参数类型完全匹配。
- 使用
Qt::UniqueConnection
避免重复连接。
-
动态连接管理
- 动态连接时管理
QMetaObject::Connection
对象,确保在目标对象销毁时断开连接。
- 动态连接时管理
-
调试工具
- 使用
QSignalSpy
检测信号发射情况。 - 启用 Qt 的调试模式,捕获信号槽的运行时警告。
- 使用
三. 总结
Qt 的信号槽机制强大灵活,极大地简化了组件间的通信,但其动态特性和依赖对象生命周期的特性也容易导致误用。
而错误使用可能会导致程序崩溃,例如 Segmentation Fault(段错误)。
这些错误通常与指针管理、线程问题或槽函数调用方式不当有关。
通过合理的设计和最佳实践,可以避免大多数因信号槽误用引发的 Segmentation Fault 问题。
在开发中,注意信号槽连接的安全性、参数匹配以及多线程的正确使用,是关键所在。
如果有其他具体的使用场景问题,可以继续深入探讨!
相关文章:
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下) 前言一. 信号槽的误用导致崩溃的常见原因1.信号和槽连接的对象被提前释放案例解决方法 2.参数类型不匹配案例解决方法 3. 多线程信号槽使用不当案例解决方法 4. 信号重复…...
测试时计算策略(BON, stepwiseBON, beamsearch, lookahead,混合方法,计算最优扩展,过程奖励模型引导,多数投票)
、Step-wise BoN、Self-Refine、Agent Workflow 一 测试时计算 测试时计算(test-time compute),也称为推理计算,是指 LLM 生成提示响应时使用的计算资源。与用于创建和完善模型本身的训练计算不同,每次使用模型时都会…...
设置postgreSQL字段自增
CREATE SEQUENCE ai_mirror_opcode_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; nextval(ai_mirror_opcode_seq) 手动创建序列并设置默认值: 如果你需要更细粒度的控制,可以手动创建一个序列,并将其设置为某个字段的…...
flask-admin的modelview 实现list列表视图中扩展修改状态按钮
背景: 在flask-admin的模型视图(modelview 及其子类)中如果不想重构UI视图,那么就不可避免的出现默认视图无法很好满足需求的情况,如默认视图中只有“新增”,“编辑”,“选中的”三个按钮。 材…...
强大且灵活的终端工具Tabby的强大功能与详细配置指南
文章目录 前言1. Tabby下载安装2. Tabby相关配置3. Tabby简单操作4. ssh连接Linux4.1 ubuntu系统安装ssh4.2 Tabby远程ssh连接ubuntu 5. 安装内网穿透工具5.1 创建公网地址5.2 使用公网地址远程ssh连接 6. 配置固定公网地址 前言 大家好!今天我要给大家安利一个超级…...
dns显示不可用是怎么回事?
在互联网的世界里,DNS(域名系统)扮演着至关重要的角色。它负责将用户输入的网址(域名)转换为服务器的IP地址,从而让用户能够访问到相应的网站。然而,有时用户可能会遇到DNS显示不可用的情况,这不仅影响上网体验,还可能…...
探索Flink动态CEP:杭州银行的实战案例
摘要:本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容: Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…...
单机服务和微服务
单体服务 一种软件开发模型,它将所有的服务组件集成在一个独立的系统单位中进行开发、部署和维护。在这种架构中,前端用户界面、后端服务器逻辑、数据库操作等组件通常紧密耦合在一起,形成一个统一的程序。这种架构模式易于开发和部署&#x…...
孔雀鱼和斑马鱼能一起养吗?
在观赏鱼的世界里,孔雀鱼和斑马鱼都是备受鱼友喜爱的热门品种。它们独特的外形和相对容易的饲养条件,使得不少养鱼新手跃跃欲试将它们混养在一起,但这其中实则有诸多因素需要考量。 从生存环境来看,孔雀鱼和斑马鱼有一定的兼容性…...
作业帮基于 Apache DolphinScheduler 3_0_0 的缺陷修复与优化
文|作业帮大数据团队(阮文俊、孙建业) 背 景 基于 Apache DolphinScheduler (以下简称DolphinScheduler)搭建的 UDA 任务调度平台有效支撑了公司的业务数据开发需求,处理着日均百万级别的任务量。 整个 UDA 的架构如…...
【LC】111. 二叉树的最小深度
题目描述: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2示…...
HarmonyOS NEXT 实战之元服务:静态案例效果--- 歌手推荐
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …...
selenium自动化测试(超详细~)
最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的…...
Spring Boot教程之三十一:入门 Web
Spring Boot – 入门 Web 如今,大多数应用程序都需要模型-视图-控制器(MVC) 架构来满足各种需求,例如处理用户数据、提高应用程序效率、为应用程序提供动态特性。它主要用于构建桌面图形用户界面 (GUI),但现在越来越流行用于构建基于 Web 的…...
【每日学点鸿蒙知识】指纹识别隐藏背面、数组内部值变化刷新UI、键盘输入类型、跨组件路由、C++20特性支持
1、HarmonyOS 指纹识别情况下,隐藏背面内容? 有一个场景,在指纹识别验证页面时候,此时需要用户看不到背面的内容,请问应该怎么处理这块。或者有什么方案,可以通过window,获取到当前页面的page&…...
Python数据处理——re库与pydantic的使用总结与实战,处理采集到的思科ASA防火墙设备信息
目录 Python正则表达式re库的基本用法 引入re库 各函数功能 总结 使用方法举例 正则表达式语法与书写方式 正则表达式的常用操作符 思科ASA防火墙数据 数据1 数据2 书写正则表达式 Python中pydantic的使用 导入基础数据模板 根据数据采集目标定义Pydantic数据类型…...
centos系统如何安装kubectl和部署kube-apiserver
1.使用 yum 安装(推荐) 添加 Kubernetes 软件源: 首先,你需要添加 Kubernetes 的官方 YUM 软件源。这可以通过下载并安装 kubernetes.repo 文件来实现。 shell cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [k…...
【源码编译】windows下mingw64安装以及cmake调用
最近因为安装MIRTK库,太多第三方依赖了,太折磨了,学习了使用Cmake,有些库又需要Fortran编译器,VS2022里面装了但又调用不了,也不知道为什么,最后装的mingw64,记录一下。 1、mingw64安…...
HarmonyOS NEXT 实战之元服务:静态案例效果---最近播放音乐
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: Index import { authentica…...
【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
前言 前几年WPS还可以免费处理5页以内的PDF转excel,现在必须付费了,而且百度其他在线的PDF转excel都是要收费的,刚好前几年调研过百度OCR的高精度含位置接口,依然是每天可以免费调用50次,本篇是基于此接口,…...
uniapp 基于xgplayer(西瓜视频) + renderjs开发,实现APP视频播放
背景:在uniapp中因原生video组件功能有限,选择引入xgplayer库来展示视频播放等功能。并且APP端无法操作dom,所以使用了renderjs。 其他的不多说,主要列举一下renderjs中需要注意的点: 1、使用:在标签后&…...
[1111].集成开发工具Pycharm安装与使用
所有博客大纲 后端学习大纲 Python大纲 1.下载: 官方下载地址 2.安装: 1.双击exe文件,然后下一步选择安装目录 2.选择桌面快捷方式及安装: 3.安装完成 3.启动: 4.设置: 4.1.设置运行时环境:…...
【玩转OCR】 | 腾讯云智能结构化OCR在多场景的实际应用与体验
文章目录 引言产品简介产品功能产品优势 API调用与场景实践图像增强API调用实例发票API调用实例其他场景 结语相关链接 引言 在数字化信息处理的时代,如何高效、精准地提取和结构化各类文档数据成为了企业和政府部门的重要需求。尤其是在面对海量票据、证件、表单和…...
红狮金业:2024年尾声,黄金市场需要关注的消息面
随着2024年的尾声渐近,全球金融市场在美联储的年度最后一次降息决策中迎来了新的波澜。上周,美联储宣布降息,而美联储主席鲍威尔随后的发言更是在市场上掀起了巨大波动。他透露,美联储计划在明年放缓降息步伐,可能仅实…...
使用BCrypt进行密码加密
1. 添加依赖: 在pom.xml文件中添加Spring Security依赖,以使用BCryptPasswordEncoder。 <!-- Spring Security 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-secu…...
《智启新材热学性能优化之路:人工智能的神奇力量》
在当今科技飞速发展的时代,材料科学与人工智能的融合正成为创新的前沿阵地。其中,利用人工智能优化材料的热学性能,为众多领域的突破带来了新的曙光,从航空航天的高效热防护到电子设备的散热管理,其影响深远且广泛&…...
IIC驱动EEPROM
代码参考正点原子 i2c_dri:主要是三段式状态机的编写 module iic_dri#(parameter SLAVE_ADDR 7b1010000 , //EEPROM从机地址parameter CLK_FREQ 26d50_000_000, //模块输入的时钟频率parameter I2C_FREQ 18d250_000 //IIC_SCL的时钟频率)( …...
目标检测——基于yolov8和pyqt的螺栓松动检测系统
目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…...
JVM系列(十三) -常用调优工具介绍
最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…...
酷睿i7和i5哪个好?i5和i7的区别介绍
在英特尔酷睿处理器家族中,i7与i5作为面向不同用户群体的主流产品,各自承载着不同的性能定位与使用价值。在面对“酷睿i7和i5哪个好”的问题时,答案并非一概而论,而是取决于具体的应用需求、预算考量以及对性能与效率的期待。本文…...
实现用户登录系统的前后端开发
**一、**实验名称 实现用户登录系统的前后端开发。 **二、**参考资料 Web开发技术第一章课件。 **三、**实验目的 1.练习前端基本技术的使用。 2.练习使用Servlet/JSP开发简单后端程序。 3.练习使用Tomcat发布Web应用。 4.练习使用Spring Boot开发简单的后端程序。 **…...
Log4j1.27配置日志输出级别不起效
起因:构建独立版本debezuim使用时,日志一直打印debug信息。 原因:包冲突问题,进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…...
一、后端到摄像头(监控摄像头IOT)
前言: 开发流程从 后端到摄像头 打通是第一步,那么我们可以着手设计 后端实现 的具体步骤,确保能够稳定地接收和处理来自摄像头的视频流,并提供后续的功能扩展,如视频流转发、存储和控制。 1. 后端系统架构设计 在开始…...
H3C MPLS跨域optionB
实验拓扑 实验需求 如图,VPN1 和 VPN2 分别通过运营商 MPLS VPN 连接各自分支机构按照图示配置 IP 地址,VPN1 和 VPN2 连接同一个 PE 设备的私网 IP 网段存在地址复用,使用多 VRF 技术来防止 IP 冲突AS 100 和 AS 200 内部的公共网络中各自运行 OSPF 使 AS 内各设备的 Loo…...
微信小程序中momentjs无法切换中文问题处理
微信小程序中momentj.s无法切换中文问题处理. 表现为 使用 locale(“zh-cn”)无效。 处理方法 # 1、先删除 miniprogram_npm\moment\index.js # 2、将 node_modules\moment\min\moment-with-locales.min.js 复制到 miniprogram_npm\moment下 并重命名为index.js # 3、修改mi…...
Linux零基础速成篇一(理论+实操)
前言:本教程适合Linux零基础学习,也适合Linux期末考试的小伙伴,从头到尾理论与实操相结合,让你快速对Linux进行了解和掌握。 一、Linux概述 为什么要学习Linux操作系统? 完全免费-开源 任何用户均可下载使用 安全…...
【087】基于51单片机智能宠物喂食器【Proteus仿真+Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统LCD1602液晶显示MY1680语音播放模块DS1302时钟芯片SG90舵机AT24C02存储芯片LED灯按键设置。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片; 2、系统采用DS1302时钟芯片实现对日期时间计时并通过LCD1602液晶显…...
全局流量管理:提升用户体验与保障服务稳定性
全局流量管理的工作原理 全局流量管理主要依赖于 DNS(域名系统)技术,通过将全球用户的访问请求引导至离他们最近的服务器或数据中心,极大减少了访问延迟和带宽负载,从而提升了用户体验。同时,GTM 还结合健…...
达梦数据守护搭建
主备库初始化 ./dminit path/dmdata/data db_nameDM01 instance_nameDMSVR01 port_num5236 page_size16 extent_size32 log_size500 case_sensitive1 SYSDBA_PWDDM01SYSDBA ./dminit path/dmdata/data db_nameDM02 instance_nameDMSVR02 port_num5236 page_size16 extent_size3…...
【C++】容器适配器全知道
亲爱的读者朋友们😃,此文开启知识盛宴与思想碰撞🎉。 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 目录 一、前言 二、什么是适配器 (一)现实生…...
企业资源规划系统(ERP)服务器上线项目实施指南
企业资源规划系统(ERP)服务器上线项目实施指南 项目背景 在当今竞争激烈的商业环境中,企业资源规划系统(ERP)已成为企业提升内部管理效率和响应市场变化的重要工具。为了实现业务流程的整合和优化,公司决…...
Kubernetes(k8s)离线部署DolphinScheduler3.2.2
1.环境准备 1.1 集群规划 本次安装环境为:3台k8s现有的postgreSql数据库zookeeper服务 1.2 下载及介绍 DolphinScheduler-3.2.2官网:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2 官网安装文档:https://dolphinscheduler.apach…...
嵌入式linux驱动框架 从0到1编写设备驱动 i2c_driver i2c_client
一、编写最简单的IIC驱动框架 在之前的文章中,我们已经深入探讨了I2C通信的基本原理、硬件架构以及时序等基础知识。现在,我们将进入一个更加实际和深入的层面,构建一个完整的I2C驱动程序,并阐述驱动框架的设计。这将帮助你不仅能…...
小程序canvas画环形百分比进度图
组件封装 component/canvas-ring目录下 canvas-ring.js <canvas style"width:{{canvasWidth}}px;height:{{canvasWidth}}px; margin:0 auto;position:relative" type"2d" id"myCanvas"><view class"circle-bar" style&quo…...
面试经验分享 | 北京渗透测试岗位
更多大厂面试经验的视频经验分享看主页 目录: 所面试的公司:安全大厂 所在城市:北京 面试职位:渗透测试工程师 面试方式:腾讯会议线上面试线下面试 面试过程: 面试官的问题: 1、说一下XSS有哪…...
安卓 SystemServer 启动流程
目录 引言 Android系统服务启动顺序 zygote fork SystemServer 进程 SystemServer启动流程 1、SystemServer.main() 2、SystemServer.run() 3、初始化系统上下文 4、创建系统服务管理 5、启动系统各种服务 总结 引言 开机启动时 PowerManagerService 调用 AudioSer…...
opencv存图速度测试
以下测试的图片,均为5488x3672分辨率的三通道彩色图。 分别使用opencv和halcon存图,测试速度,存100次取平均值,结果如下: image size:5488 3672 opencv jpg save time 0.12809s opencv bmp save time 0.02197s hal…...
[ffmpeg]编译 libx264
步骤 下载 libx264 git clone https://code.videolan.org/videolan/x264.git cd x264环境搭建 然后在开始菜单中找到并打开 x64 Native Tools Command Prompt for VS 2019 : 打开 msys2_shell.cmd -use-full-path 这时会打开 MSYS 的新窗口,先把一些汇…...
常见API
1.API 1.1API概述 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要…...
vscode写python,遇到问题:ModuleNotFoundError: No module named ‘pillow‘(已解决 避坑)
1 问题: ModuleNotFoundError: No module named pillow 2 原因: 原因1:安装Pillow的pip命令所处的python版本与vscode调用的python解释器版本不同。 如: 原因2:虽然用的是pillow,但是写代码的时候只能用…...