QML与C++:基于ListView调用外部模型进行增删改查(性能优化版)
目录
- 引言
- 相关阅读
- 工程结构
- 数据模型设计
- DataModel 类
- ContactProxyModel 类
- 为什么使用QSortFilterProxyModel?
- 应用初始化与模型连接
- UI实现
- 性能分析与优化
- 运行效果
- 扩展思考
- 总结
- 下载链接
引言
在上一篇中介绍了基于ListView调用外部模型进行增删改查,本文在此基础之上进行性能优化,由于篇幅有限,会省略部分代码,完整代码请看本文最后的下载链接。
本文将以一个能够流畅处理10万条联系人数据的QML应用为例,详细介绍如何利用Qt的模型-视图架构和QSortFilterProxyModel实现高性能的数据筛选和展示功能。通过这个实例,读者可以了解Qt Model & View在大数据量处理方面的优势以及相关的开发技巧。
相关阅读
- 接上篇 —— QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)
工程结构
该示例项目采用了典型的Qt/QML混合开发架构,主要由C++实现数据模型,QML负责用户界面设计。下面通过mermaid图展示工程的整体结构:
核心文件说明:
- main.cpp: 应用入口,创建模型并连接到QML
- datamodel.h/cpp: 数据模型定义和实现
- Main.qml: 主界面设计
- ContactDialog.qml: 联系人添加/编辑对话框
- components/: 自定义控件目录
数据模型设计
本项目的核心在于高效的数据模型设计,主要采用了两层模型结构:
- 基础数据模型 (DataModel):继承自QAbstractListModel,负责基础数据的存储和管理
- 代理模型 (ContactProxyModel):继承自QSortFilterProxyModel,负责数据筛选和排序
下面详细分析这两个模型的实现:
DataModel 类
class ContactItem {
public:ContactItem(const QString &name, const QString &phone): m_name(name), m_phone(phone) {}QString name() const { return m_name; }QString phone() const { return m_phone; }QString firstLetter() const { return m_name.isEmpty() ? "?" : m_name.left(1).toUpper(); }private:QString m_name;QString m_phone;
};class DataModel : public QAbstractListModel
{Q_OBJECTpublic:enum Roles {NameRole = Qt::UserRole + 1,PhoneRole,FirstLetterRole};explicit DataModel(QObject *parent = nullptr);int rowCount(const QModelIndex &parent = QModelIndex()) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;QHash<int, QByteArray> roleNames() const override;Q_INVOKABLE bool addContact(const QString &name, const QString &phone);Q_INVOKABLE bool removeContact(int index);Q_INVOKABLE bool editContact(int index, const QString &name, const QString &phone);private:QList<ContactItem> m_items;
};
DataModel类继承自QAbstractListModel,主要职责是存储和管理联系人数据。它具有以下几个关键特性:
- 使用了轻量级的
ContactItem
类来封装每个联系人的信息 - 定义了自定义角色枚举,用于在QML中访问数据
- 实现了必要的虚函数:rowCount、data和roleNames
- 提供了添加、删除和编辑联系人的Q_INVOKABLE方法,使其可从QML直接调用
在构造函数中生成了10万条测试数据:
DataModel::DataModel(QObject *parent): QAbstractListModel(parent)
{// 记录开始时间qint64 startTime = QDateTime::currentMSecsSinceEpoch();// 预分配空间以提高性能m_items.reserve(100000);// 开始批量插入beginInsertRows(QModelIndex(), 0, 99999);// 添加10万条测试数据for(int i = 0; i < 100000; ++i) {m_items.append(ContactItem(generateRandomName(), generateRandomPhone()));}endInsertRows();// 计算并输出耗时qint64 endTime = QDateTime::currentMSecsSinceEpoch();qDebug() << "添加10万条数据耗时:" << (endTime - startTime) << "毫秒";
}
这里有几个值得注意的性能优化点:
- 使用
reserve
预分配空间,避免频繁的内存重分配 - 使用
beginInsertRows
和endInsertRows
包裹大量数据的插入,这是一种批处理技术,减少了模型更新通知的次数 - 添加计时代码,用于测量大量数据处理的性能
ContactProxyModel 类
class ContactProxyModel : public QSortFilterProxyModel
{Q_OBJECTQ_PROPERTY(QString filterString READ filterString WRITE setFilterString NOTIFY filterStringChanged)public:explicit ContactProxyModel(QObject *parent = nullptr);QString filterString() const { return m_filterString; }void setFilterString(const QString &filterString);Q_INVOKABLE bool removeContact(int index);Q_INVOKABLE bool editContact(int index, const QString &name, const QString &phone);signals:void filterStringChanged();protected:bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;private:QString m_filterString;
};
ContactProxyModel是整个应用的关键部分,它继承自QSortFilterProxyModel,主要负责数据的过滤和展示。它具有以下特点:
- 定义了一个Q_PROPERTY属性
filterString
,用于接收来自QML的搜索文本 - 重写了
filterAcceptsRow
方法,实现自定义的过滤逻辑 - 为QML提供了代理方法,将操作转发至底层的DataModel
实现部分:
ContactProxyModel::ContactProxyModel(QObject *parent): QSortFilterProxyModel(parent)
{setFilterCaseSensitivity(Qt::CaseInsensitive);setSortCaseSensitivity(Qt::CaseInsensitive);
}void ContactProxyModel::setFilterString(const QString &filterString)
{if (m_filterString != filterString) {m_filterString = filterString;emit filterStringChanged();invalidateFilter();}
}bool ContactProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{if (m_filterString.isEmpty())return true;QModelIndex nameIndex = sourceModel()->index(sourceRow, 0, sourceParent);QModelIndex phoneIndex = sourceModel()->index(sourceRow, 0, sourceParent);QString name = sourceModel()->data(nameIndex, DataModel::NameRole).toString();QString phone = sourceModel()->data(phoneIndex, DataModel::PhoneRole).toString();return name.contains(m_filterString, Qt::CaseInsensitive) ||phone.contains(m_filterString, Qt::CaseInsensitive);
}bool ContactProxyModel::removeContact(int index)
{if (DataModel *model = qobject_cast<DataModel*>(sourceModel())) {QModelIndex sourceIndex = mapToSource(this->index(index, 0));return model->removeContact(sourceIndex.row());}return false;
}bool ContactProxyModel::editContact(int index, const QString &name, const QString &phone)
{if (DataModel *model = qobject_cast<DataModel*>(sourceModel())) {QModelIndex sourceIndex = mapToSource(this->index(index, 0));return model->editContact(sourceIndex.row(), name, phone);}return false;
}
为什么使用QSortFilterProxyModel?
QSortFilterProxyModel是Qt中非常强大的一个类,在本项目中使用它主要有以下几个优势:
-
数据与视图分离:原始数据模型(DataModel)只负责数据的存储和管理,而过滤和排序逻辑由代理模型(ContactProxyModel)处理,实现了关注点分离
-
高效的数据过滤:QSortFilterProxyModel内部实现了高效的过滤机制,即使在10万条数据的情况下,也能实现实时过滤而不影响UI的响应性
-
无需修改原始数据:过滤和排序不会修改原始数据,仅影响视图的展示,保持了数据的完整性
-
懒加载机制:QSortFilterProxyModel采用了懒加载机制,只有当数据需要显示时才会进行过滤操作,大大提高了性能
-
索引映射:代理模型自动处理了索引的映射,在删除或编辑项目时,不必手动计算筛选后的索引与原始数据的对应关系
下面的代码片段展示了这一映射机制:
bool ContactProxyModel::removeContact(int index)
{if (DataModel *model = qobject_cast<DataModel*>(sourceModel())) {QModelIndex sourceIndex = mapToSource(this->index(index, 0));return model->removeContact(sourceIndex.row());}return false;
}
这段代码通过mapToSource
将代理模型中的索引映射回源模型中的索引,然后调用源模型的removeContact
方法。这种机制在处理筛选后的数据时尤为重要,因为筛选后的索引与原始数据的索引并不一致。
应用初始化与模型连接
在main.cpp中,创建数据模型和代理模型,并将它们连接起来:
int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;QObject::connect(&engine,&QQmlApplicationEngine::objectCreationFailed,&app,[]() { QCoreApplication::exit(-1); },Qt::QueuedConnection);// 创建数据模型实例DataModel *model = new DataModel(&engine);// 创建代理模型实例ContactProxyModel *proxyModel = new ContactProxyModel(&engine);proxyModel->setSourceModel(model);// 将模型暴露给QMLengine.rootContext()->setContextProperty("contactModel", proxyModel);engine.loadFromModule("qml_listview_model", "Main");return app.exec();
}
这里的关键点是:
- 创建DataModel实例作为基础数据模型
- 创建ContactProxyModel实例并通过
setSourceModel
设置其数据源 - 通过
setContextProperty
将代理模型暴露给QML,使得QML可以直接访问和操作模型
UI实现
应用的UI部分主要通过QML实现,包括主界面(Main.qml)和联系人编辑对话框(ContactDialog.qml)。UI设计采用了现代的Material Design风格,具有搜索框、联系人列表和操作按钮等组件。
Main.qml的核心部分是ListView组件,它绑定的代理模型:
ListView {id: contactListViewanchors.fill: parentanchors.rightMargin: scrollBar.widthmodel: contactModelspacing: 10clip: true// 启用滚动条绑定ScrollBar.vertical: scrollBardelegate: Rectangle {// 联系人项的UI实现// ...}
}
搜索功能的实现非常简洁:
CustomTextField {id: searchFieldLayout.fillWidth: trueplaceholderText: "搜索联系人..."leftIcon: "qrc:/icons/find.png"onTextChanged: contactModel.filterString = textonRightIconClicked: {text = ""contactModel.filterString = ""}
}
当用户在搜索框中输入文本时,onTextChanged
事件会将文本赋值给代理模型的filterString
属性。然后代理模型会自动应用过滤逻辑并更新视图。
性能分析与优化
在处理10万条数据的过程中,采用了以下性能优化策略:
- 数据批量处理:使用beginInsertRows/endInsertRows批量添加数据,减少模型更新通知
- 内存预分配:使用reserve预分配内存空间,避免频繁的内存重分配
- 懒加载机制:利用QSortFilterProxyModel的懒加载特性,只处理需要显示的数据
- 高效数据结构:使用轻量级的ContactItem类,减少内存占用
- 视图优化:ListView中使用clip属性限制渲染区域,减少不必要的绘制
在DataModel的构造函数中,增加了性能测量代码:
qint64 startTime = QDateTime::currentMSecsSinceEpoch();
// 添加数据的代码...
qint64 endTime = QDateTime::currentMSecsSinceEpoch();
qDebug() << "添加10万条数据耗时:" << (endTime - startTime) << "毫秒";
在本机上,这段代码只需130毫秒就能完成10万条数据的加载。而在搜索过滤时,即使是10万条数据,响应也是即时的,不会出现明显的延迟。
运行效果
如图所示,应用在加载10万条联系人数据后仍能保持流畅的操作体验,包括:
- 滚动列表时没有明显卡顿
- 搜索过滤响应及时
- 编辑操作即时反映在界面上
扩展思考
本示例已经能够处理10万级的数据量并通过UI展示出来,然后继续尝试加载百万级数据(在本机,ListView通过模型加载1百万条数据需要1.3秒),但在此基础上进行搜索过滤操作,会比较卡。以下是一些可能的扩展和优化方向:
- 分页加载:对于超大数据量,可以考虑分页加载。
- 多线程数据处理:将数据加载和处理放在单独的线程中,避免阻塞UI线程。
- 数据持久化:添加数据库支持,实现数据的持久化存储。
- 更复杂的过滤和排序:支持多条件过滤和自定义排序规则。
总结
本文详细介绍了如何利用Qt的模型-视图架构和QSortFilterProxyModel实现高性能的数据处理和展示。关键要点包括:
- 使用QAbstractListModel实现基础数据模型,负责数据的存储和管理
- 使用QSortFilterProxyModel实现代理模型,负责数据的过滤和排序
- 采用批量处理、内存预分配等技术提高性能
- 利用Qt的模型-视图架构实现数据和视图的分离,提高代码的可维护性
下载链接
完整项目源码可从以下链接获取:GitCode -> QML ListView 示例
相关文章:
QML与C++:基于ListView调用外部模型进行增删改查(性能优化版)
目录 引言相关阅读工程结构数据模型设计DataModel 类ContactProxyModel 类 为什么使用QSortFilterProxyModel?应用初始化与模型连接UI实现 性能分析与优化运行效果扩展思考总结下载链接 引言 在上一篇中介绍了基于ListView调用外部模型进行增删改查,本文…...
集合常用Stream操作
1、中间操作 filter()过滤 将流中的元素筛选出满足条件的元素 List<String> list Arrays.asList("abc","test","demo","frse","fesfes"); list.stream().filter(s -> s.startsWith("f")).forEach(Sy…...
ReactNative中处理安全区域问题
RN原生方案不支持android系统,所以在此使用三方组件react-native-safe-area-context 1、安装插件 yarn add react-native-safe-area-context2、安装完成后直接yarn ios可能会失败,需要先 cd ios && pod install && cd ..出来再继…...
二、The Power of LLM Function Calling
一、Function Calling 的诞生背景 1. 传统LLM的局限性 静态文本生成的不足:早期的LLM(如早期版本的ChatGPT)主要依赖预训练的知识库生成文本,但无法直接与外部系统或API交互。这意味着它们只能基于历史数据回答问题,…...
贪心算法day10(无重叠区间)
1.无重叠区间 435. 无重叠区间 - 力扣(LeetCode) 思路: 代码: class Solution {public static int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(v1,v2)->{return v1[0]-v2[0];});int left interva…...
reactive 解构赋值给 ref
在 Vue 3 中,当你执行以下操作时: javascript const applyBasicInfo ref(); applyBasicInfo.value { ...props.applyBasicInfo }; 最终的 applyBasicInfo.value 是响应式对象,但与原对象 props.applyBasicInfo 的响应性完全独立…...
MongoDB简单用法
图片中 MongoDB Compass 中显示了默认的三个数据库: adminconfiglocal 如果在 .env 文件中配置的是: MONGODB_URImongodb://admin:passwordlocalhost:27017/ MONGODB_NAMERAGSAAS💡 一、为什么 Compass 里没有 RAGSAAS 数据库?…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(4): 可能形(かのうけい)
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(4): 可能形(かのうけい) 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)~んです 復習(ふくしゅう)(2)いただけませんか 復習(ふくしゅう)(3)可能形(かのうけい)(1)1グループ:(2)2グループ…...
Windows 下 MongoDB ZIP 版本安装指南
在开发和生产环境中,MongoDB 是一种非常流行的 NoSQL 数据库,以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说,MongoDB 提供了多种安装方式,其中 ZIP 版本因其灵活性和轻量级的特点,成为很多开发者的首选…...
万字长篇————C语言指针学习汇总
经过一段时间的学习,我们已经接触到了C语言的很多知识了。不过目前我们接下来我们要接触C语言中一个最大的“门槛”:指针。 什么是指针? 在介绍指针之前,我们首先要明白变量与地址之间的关系。 举一个生活中的案例:一…...
day29图像处理OpenCV
文章目录 一、图像预处理6 图像色彩空间转换6.3灰色/BGR/HSV相互转化 7 彩图转灰图方法7.1 最大值法7.2 平均值法7.3 加权均值法7.4 案例 8 图像二值化处理8.1 阈值法(typecv2.THRESH_BINARY)8.2 反阈值法(THRESH_BINARY_INV)8.3 截断阈值法(THRESH_TRUNC)8.4 低阈值零处理(THR…...
Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。
目录 一. 打印日志的常见三种方法? 1.1 手动创建 Logger 对象(基于SLF4J API) 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口(使用频率较低) 二. 常见的 Logger,logger,…...
KrillinAI:视频跨语言传播的一站式AI解决方案
引言 在全球内容创作领域,跨语言传播一直是内容创作者面临的巨大挑战。传统的视频本地化流程繁琐,涉及多个环节和工具,不仅耗时耗力,还常常面临质量不稳定的问题。随着大语言模型(LLM)技术的迅猛发展,一款名为Krillin…...
PDF处理控件Aspose.PDF指南:使用 C# 从 PDF 文档中删除页面
需要从 PDF 文档中删除特定页面?本快速指南将向您展示如何仅用几行代码删除不需要的页面。无论您是清理报告、跳过空白页,还是在共享前自定义文档,C# 都能让 PDF 操作变得简单高效。学习如何以编程方式从 PDF 文档中选择和删除特定页面&#…...
在 IntelliJ IDEA 中开发 Java Web 项目时,遇到包内明明存在某个类但类名仍然爆红(显示红色错误提示)
在 IntelliJ IDEA 中开发 Java Web 项目时,遇到包内明明存在某个类但类名仍然爆红(显示红色错误提示),而项目却能正常运行,重启 IDEA 后问题依旧,这通常是由以下原因及解决方法导致的: 1. 缓存…...
【4】k8s集群管理系列--harbor镜像仓库本地化搭建
一、harbor基本概念 Harbor是一个由VMware开源的企业级Docker镜像仓库解决方案,旨在解决企业在容器化应用部署中的痛点,提供镜像存储、管理、安全和分发的全生命周期管理。Harbor扩展了Docker Registry,增加了企业级功能,如…...
Active Directory域服务管理与高级应用技术白皮书
目录 一、Active Directory核心架构解析 1.1 AD域服务核心组件 1.2 域功能级别演进 1.3 AD LDS应用场景 二、企业级域环境部署最佳实践 2.1 域控制器部署规划 2.2 高可用架构设计 2.3 客户端入域优化 三、高级域管理技术 3.1 精细化权限管理 3.2 组策略深度配置 3.3…...
OCP中的OCS operator介绍及应用示例
一、OCS operator介绍 在 Red Hat OpenShift Container Platform(OCP4.8版之前,包含4.8) 中,OCS Operator(OpenShift Container Storage Operator) 是用于在 OpenShift 集群中部署、配置和管理 OpenShift …...
Linux-服务器添加审计日志功能
#查看audit软件是否在运行(状态为active而且为绿色表示已经在运行) systemctl start auditd #如果没有在运行的话,查看是否被系统禁用 (audit为0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改为audit=1 #更新GRUB…...
ARM Cortex-M中断处理全解析
今天我们聊一聊ARM Cortex-M中断处理。在嵌入式系统中,中断是实现实时响应的核心机制。想象一下,如果没有中断: 按键按下时,系统可能忙于其他任务而错过响应通信数据到来时,可能因为没及时处理而丢失定时任务难以精确…...
douyin_search_tool | 用python开发的抖音关键词搜索采集软件
本软件工具仅限于学术交流使用,严格遵循相关法律法规,符合平台内容合法性,禁止用于任何商业用途! 抖音作为国内颇受欢迎的短视频社交平台,汇聚了大量用户群体和活跃用户。分析平台上的热门视频可用于市场调研和竞品分析…...
基于FreeBSD的Unix服务器网络配置
Unix系统版本 FreeBSD-10.1-i386 网络配置 1.配置网络ip及网关 #编辑配置文件 ee /etc/rc.conf #参照如下内容设置 ifconfig_em0”inet 192.168.1.189 netmask 255.255.255.0” defaultrouter”192.168.1.1” #回到命令模式 esc #保存 a a 2.配置dns #编辑配置文件 ee /etc/…...
Margin和Padding在WPF和CSS中的不同
CSS和WPF中 margin 与 padding 在方向上的规定基本一致,但在使用场景和一些细节上有所不同。 CSS - 方向规定: margin 和 padding 属性可以分别指定上、右、下、左四个方向的值。例如 margin:10px 20px 30px 40px; 表示上外边距为10px、右外边距为20…...
JVM 概述
JVM概述 JVM的全为 Java Virtual Machine,但是目前的 JVM 已经不再与任何语言进行深度耦合了,其本质就是运行在计算机上的程序,职责是运行处理 Java 字节码文件。 JVM 功能 解释和运行 JVM 会对字节码文件中的指令,实时的解释为…...
基于django云平台的求职智能分析系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,招聘信息管理系统当然不能排除在外。求职智能分析系统是在实际应用和软件工程的开发原理之上,运用Python语言、爬虫技术以及Dj…...
在 Ubuntu 上通过 Docker 部署 Misskey 服务器
在这篇博客中,我们将探讨如何在 Ubuntu 上通过 Docker 部署 Misskey 服务器。Misskey 是一个开源的社交网络平台,支持丰富的社交功能,适合个人和小型社群使用。而 Docker 则是一个便捷的容器化平台,允许开发者轻松地打包、发布和运…...
Pytorch 第十五回:神经网络编码器——GAN生成对抗网络
Pytorch 第十五回:神经网络编码器——GAN生成对抗网络 本次开启深度学习第十五回,基于Pytorch的神经网络编码器。本回分享的是GAN生成对抗网络。在本回中,通过minist数据集来分享如何建立一个GAN生成对抗网络。接下来给大家分享具体思路。 本…...
gitlab如何查看分支的创建时间
在 GitLab 上查看分支创建时间,常规的界面不会直接显示,但可以通过以下几种方法查到准确时间: 方法一:通过 GitLab Web 界面查看首次提交时间(近似) 打开你的项目仓库。点击左侧的「Repository(…...
centos时间不正确解决
检查当前系统时间 date如果时间明显不正确,可以进一步检查硬件时钟(BIOS 时间): bash复制代码hwclock --show同步时间(推荐方式) 为了确保系统时间准确,建议使用 NTP(网络时间协议…...
ubuntu启动 Google Chrome 时默认使用中文界面,设置一个永久的启动方式
方法 :通过桌面快捷方式设置 编辑 Chrome 的桌面快捷方式: 找到您的 Google Chrome 快捷方式文件。如果是通过菜单启动,通常会在以下路径找到与 Chrome 相关的 .desktop 文件: sudo vim /usr/share/applications/google-chrome.d…...
opencv腐蚀的操作过程
在腐蚀操作的详细流程中,遍历图像的过程如下: 初始化: 设置一个起始位置(通常从图像的左上角开始)。 准备好结构元素(structuring element),它是一个小的矩阵,大小通常是…...
Docker--Docker镜像原理
docker 是操作系统层的虚拟化,所以 docker 镜像的本质是在模拟操作系统。 联合文件系统(UnionFS) 联合文件系统(UnionFS) 是Docker镜像实现分层存储的核心技术,它通过将多个只读层(Image Laye…...
HL7消息编辑器的使用手册
REDISANT 提供互联网与物联网开发测试套件 # 互联网与中间件: Redis AssistantZooKeeper AssistantKafka AssistantRocketMQ AssistantRabbitMQ AssistantPulsar AssistantHBase AssistantNoSql AssistantEtcd AssistantGarnet Assistant 工业与物联网࿱…...
技术与情感交织的一生 (六)
目录 食色性也 Z 姐 Pizza “修罗场” 之战 大二 下 EP 混乱 危机 撤退 离别 初创 重逢 食色性也 美食、美器、美女。追求美好的事物是人的天性。八部众里,天众界:因修行,有美食而无美女;阿修罗界:因产力…...
AI搜索引擎的局限性
# 揭秘AI搜索引擎的局限性与深度爬取技巧 > 摘要:本文深入分析了基于关键词的AI搜索引擎局限性,探讨了深网内容难以被发现的原因,并提供了一系列实用技巧来提高信息获取的全面性。无论是开发者、研究人员还是普通用户,了解这些…...
IPD项目管理的“黄金三角“在2025年是否需要重构?
——技术革命下的组织进化与实践创新 一、时空背景:IPD黄金三角的底层逻辑与时代挑战 IPD(集成产品开发)管理体系自1998年引入中国以来,其"黄金三角"——跨职能团队协作、结构化流程体系、决策评审机制——始终是企业…...
Jarpress 开源项目重构公告
项目背景 经过长达三个月的技术攻坚,我们正式宣布完成对九年历史开源项目的全面重构升级!原项目基于JFina框架开发,现采用SpringBootMyBatis技术栈重构,正式更名为Jarpress。 架构升级 采用最小组件依赖实现,减少系…...
Redshift 2025.4.1 版本更新:多平台兼容性与功能修复
2025 年 4 月 10 日,Redshift 发布 2025.4.1 版本(2025.04),聚焦宿主软件兼容性提升与核心功能修复,具体更新如下: 各平台适配与优化 Maya/3ds Max/Blender:新增对 Maya 2026、3ds Max 2026、…...
使用crxjs插件编写浏览器扩展插件遇到的问题 Waiting for the extension service worker...
目前最新的vitejs/plugin-vue和crxjs/vite-plugin不兼容,在crxjs官网有写 修改插件版本如下: "devDependencies": {"crxjs/vite-plugin": "^1.0.14","vitejs/plugin-vue": "^2.3.4","vite"…...
数据库学习通期末复习一
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
数据分析实战案例:使用 Pandas 和 Matplotlib 进行居民用水
原创 IT小本本 IT小本本 2025年04月15日 18:31 北京 本文将使用 Matplotlib 及 Seaborn 进行数据可视化。探索如何清理数据、计算月度用水量并生成有价值的统计图表,以便更好地理解居民的用水情况。 数据处理与清理 读取 Excel 文件 首先,我们使用 pan…...
生态环境影响评价全解析
生态环境影响评价的原则、方法、工作程序、指标选择、参数计算、模型模拟、报告编制 一 :生态环境影响评价的基本程序 生态环境影响评价的涵义、生态影响的类型;生态环境影响评价的原则、流程、等级确定及工作范围。 图1 空间尺度上长江对中华鲟的累积…...
【Netty篇】Netty的线程模型
目录 一、Netty 线程模型是啥?二、Netty 线程模型有啥作用?三、Netty 线程模型解决了什么问题?四、如何使用 Netty 线程模型?五、Netty 线程模型的优缺点?六、总结 🌟我的其他文章也讲解的比较有趣…...
PyTorch实现权重衰退:从零实现与简洁实现
一、权重衰退原理 权重衰退(L2正则化)通过向损失函数添加权重的L2范数惩罚项,防止模型过拟合。其损失函数形式为: 二、从零开始实现 1.1 导入库与数据生成 %matplotlib inline import torch from torch import nn from d2l imp…...
Webflux声明式http客户端:Spring6原生HttpExchange实现,彻底摒弃feign
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
python的strip()函数用法; 字符串切片操作
python的strip()函数用法 目录 python的strip()函数用法代码整体功能概述代码详细解释1. `answer["output_text"]`2. `.strip()`3. `final_answer = ...`字符串切片操作:answer[start_index + len("Helpful Answer:"):].strip()整体功能概述代码详细解释1…...
多模态大语言模型arxiv论文略读(二十一)
EgoPlan-Bench: Benchmarking Multimodal Large Language Models for Human-Level Planning ➡️ 论文标题:EgoPlan-Bench: Benchmarking Multimodal Large Language Models for Human-Level Planning ➡️ 论文作者:Yi Chen, Yuying Ge, Yixiao Ge, Mi…...
MCP学习资料
Anthropic 官方:https://modelcontextprotocol.io/introduction 中文站:https://mcpcn.com/docs/examples/...
《Training Language Models to Self-Correct via Reinforcement Learning》全文翻译
《Training Language Models to Self-Correct via Reinforcement Learning》 通过强化学习训练语言模型实现自我修正 Aviral Kumar ∗ , 1 { }^{\\*, 1} ∗,1, Vincent Zhuang ∗ , 1 { }^{\\*, 1} ∗,1, Rishabh Agarwal ∗ , 1 { }^{\\*}, 1 ∗,1, Yi Su ∗ , 1 { }^…...
Rust 之五 所有权、.. 和 _ 语法、引用和切片、Vec<T>、HashMap<K, V>
概述 Rust 的基本语法对于从事底层 C/C 开发的人来说多少有些难以理解,虽然官方有详细的文档来介绍,不过内容是相当的多,看起来也费劲。本文通过将每个知识点简化为 一个 DEMO 每种特性各用一句话描述的形式来简化学习过程,提高学…...