【CXX-Qt】4.1 extern “RustQt“
-
QObjects
-
Properties
+Methods
- Signals
#[cxx_qt::bridge]
mod ffi {extern "RustQt" {}
}
extern “RustQt” 部分是 CXX-Qt 桥接的核心,用于声明 Rust 类型和签名,使其可用于 Qt 和 C++。
CXX-Qt 代码生成器使用你的 extern “RustQt” 部分生成一个包含相应 C++ 声明的 C++ 头文件。生成的头文件与输入的 Rust 文件同名,但扩展名为 .cxxqt.h。
一个桥接模块可以包含零个或多个 extern “RustQt” 块。
这补充了 extern “Rust” CXX 部分,但允许在 C++ 类型上声明 Qt 特定的功能。
可以通过块级属性自动转换为驼峰命名或蛇形命名。
QObjects
#[qobject] 属性可以放在类型别名上,以在 C++ 中生成一个 QObject 类型。
类型别名的左侧指定在 C++ 中生成的 QObject 类型。在引用 C++ 上下文时,应使用此类型。类型别名的右侧指定提供类型内部实现的 Rust 类型(例如字段)。
#[cxx_qt::bridge]
mod ffi {extern "RustQt" {#[qobject]type MyObject = super::MyObjectRust;}
}#[derive(Default)]
struct MyObjectRust;
📝 注意:目前,只有 `super::` 允许作为内部 Rust 类型的路径。因此,Rust 类型必须在桥接模块外部可用。如果你想重用现有类型,可以使用 `pub use` 指令将任何类型引入作用域。
QML 属性
通过使用 #[qml_element] 属性,可以在构建时直接将 QObject 注册为 QML 类型。
unsafe extern "RustQt" {// QObject 定义// 我们告诉 CXX-Qt 我们想要一个名为 MyObject 的 QObject 类// 基于 Rust 结构体 MyObjectRust。#[qobject]#[qml_element]#[qproperty(i32, number)]#[qproperty(QString, string)]#[namespace = "my_object"]type MyObject = super::MyObjectRust;
}
此外,你可以使用以下属性配置 QML 注册:
-
#[qml_element]:将类型声明为 QML 元素。可以使用替代类型名称,例如 #[qml_element = “MyName”]。
-
#[qml_uncreatable]:标记该类型无法从 QML 创建。它仍然可以通过 C++/Rust 代码返回。
-
#[qml_singleton]:QObject 的实例将作为单例在 QML 中实例化。
Rust 文件必须包含在 build.rs 文件中的 QML 模块中。
base 属性
使用 base 属性指定 C++ 类,C++ QObject 将从该类继承。基类必须直接或间接继承自 QObject。如果未指定 base 属性,它将直接继承自 QObject。
extern "RustQt" {#[qobject]#[base = "QAbstractListModel"]#[qml_element]#[qproperty(State, state)]type CustomBaseClass = super::CustomBaseClassRust;
}
使用 CXX 的 include! 宏包含基类的适当 C++ 头文件:
unsafe extern "C++" {include!(<QtCore/QAbstractListModel>);/// Qt 类型的基类type QAbstractListModel;
}
有关继承和如何重写方法的更多信息,请参阅 继承与重写 页面。
完整示例
Traits
#[qobject] 标记的结构体需要实现 Default trait,可以通过手动实现或使用 #[derive(Default)] 宏。或者,类型需要实现 cxx_qt::Constructor trait。
有关更多文档,请参阅 traits 页面。
属性
可以在 #[qobject] 标记的类型上指定 #[qproperty(TYPE, NAME, …)] 属性,以在生成的 QObject 上暴露一个 Q_PROPERTY。
unsafe extern "RustQt" {// QObject 定义// 我们告诉 CXX-Qt 我们想要一个名为 MyObject 的 QObject 类// 基于 Rust 结构体 MyObjectRust。#[qobject]#[qml_element]#[qproperty(i32, number)]#[qproperty(QString, string)]#[namespace = "my_object"]type MyObject = super::MyObjectRust;
}
如果未在属性上指定其他属性,CXX-Qt 将自动生成 setter 和 getter,以及一个 “changed” 信号。属性的类型和名称必须与内部 Rust 结构体中的字段匹配。
#[derive(Default)]
pub struct MyObjectRust {number: i32,string: QString,
}
CXX-Qt 将生成以下函数:
C++ | Rust | |
---|---|---|
setter | set | set_ |
getter | get | |
changed signal | Changed | _changed |
与任何信号一样,CXX-Qt 将在 Rust 端生成相应的连接函数:
-
connect: connect__changed
-
on: on__changed
其中 是属性的名称。
这些 setter 和 getter 确保每次编辑属性时都会发出 changed 信号。
自定义属性
如果自动生成的函数不适用于你的用例,你可以禁用 CXX-Qt 的自动生成并编写完全自定义的属性。例如,如果你的属性不对应于内部 Rust 结构体中的任何单个字段,则可能需要这样做。
你可以使用标志指定自定义 getter、setter 和通知信号,例如:#[qproperty(TYPE, NAME, READ = myGetter, WRITE = mySetter, NOTIFY = myOnChanged)]。
📝 注意:标志的键使用全大写字母,如 Qt 版本的 `qproperty`。
可以组合使用标志或完全省略某些标志,但如果指定了任何标志,则必须包含 READ 标志。
如果为标志指定了自定义函数,则必须在桥接中声明该函数,并且必须存在相应的实现。
某些标志可以在不指定函数的情况下传递(例如 READ 和 READ=…)。对于这些标志,如果未提供函数,CXX-Qt 将自动生成实现,如上一节所述。例如,#[qproperty(i32, num, READ)] 将自动生成一个名为 get_num 的 getter 函数(在 Rust 中)和 getNum(在 C++ 中)。因此,#[qproperty(i32, num)] 只是 #[qproperty(i32, num, READ, WRITE, NOTIFY)] 的简写。
此外,可以像其他项目上的属性一样使用 cxx_name 和 rust_name。例如,#[qproperty(i32, num, cxx_name = “numberProp”)]。
示例
-
#[qproperty(TYPE, NAME, READ)]:具有自动生成的 getter 的只读属性。
-
#[qproperty(TYPE, NAME, READ = myGetter, WRITE, NOTIFY)]:提供自定义 getter,但自动生成 setter 和 changed 信号。
-
#[qproperty(TYPE, NAME)]:是 #[qproperty(TYPE, NAME, READ, WRITE, NOTIFY)] 的简写。
-
#[qproperty(TYPE, NAME, WRITE)]:错误,因为需要 READ 标志。
可用标志
-
READ 或 READ = my_getter:指定属性应为可读的(如果传递了标志,则始终需要),带有可选的用户定义 getter。
-
WRITE 或 WRITE = my_setter:指定属性应为可写的,带有可选的用户定义 setter。
-
NOTIFY 或 NOTIFY = my_on_changed:指定属性应在更改时发出通知信号,带有可选的用户定义信号名称。
-
CONSTANT:指定属性应为常量(意味着 getter 对于该特定实例始终返回相同的值)。
CONSTANT 不可用于使用 WRITE 或 NOTIFY 的属性,并且不会编译。
-
REQUIRED:指定属性必须由类的用户设置,在 QML 中很有用,因为除非设置了属性,否则无法实例化类。
-
FINAL:指定属性不会被派生类覆盖。
-
RESET = my_reset:指定重置属性为默认值的函数,必须提供用户函数,否则不会编译。
-
cxx_name = “myCxxName”:指定在 C++ 端使用的替代名称,适用于属性名称以及自动生成的函数。
-
rust_name = “my_rust_name”:指定在 Rust 端使用的替代名称,适用于属性名称以及自动生成的函数。
方法
任何带有 self 参数的签名都被解释为 Rust 方法,并暴露给给定类型的 C++ 方法。类型必须是共享引用 self: &T 或固定可变引用 self: Pin<&mut T>,其中 T 是 QObject 类型。
unsafe extern "RustQt" {/// 仅 C++ 方法,返回红色值#[cxx_name = "redValue"]fn red_value(self: &RustInvokables) -> f32;
}
然后在桥接外部正常编写方法的实现。
impl qobject::RustInvokables {/// 仅 C++ 方法,返回红色值pub fn red_value(&self) -> f32 {self.red}
}
注意这里使用 `impl qobject::T` 而不是 `impl T`,其中 `qobject` 是桥接模块名称。
可调用方法
可以在签名上指定 #[qinvokable] 属性,以在 C++ 中将其暴露为 Q_INVOKABLE。
unsafe extern "RustQt" {/// 不可变的可调用方法,返回 QColor#[qinvokable]#[cxx_name = "loadColor"]fn load_color(self: &RustInvokables) -> Result<QColor>;/// 可变的可调用方法,存储颜色#[qinvokable]#[cxx_name = "storeColor"]fn store_color(self: Pin<&mut RustInvokables>, red: f32, green: f32, blue: f32);/// 可变的可调用方法,使用枚举存储颜色#[qinvokable]#[cxx_name = "storeColorWithEnum"]fn store_color_with_enum(self: Pin<&mut RustInvokables>, color: Color);/// 无可变参数的可调用方法,重置颜色#[qinvokable]fn reset(self: Pin<&mut RustInvokables>);
}
然后实现与非可调用方法没有区别。
impl qobject::RustInvokables {/// 不可变的可调用方法,返回 QColorpub fn load_color(&self) -> Result<QColor, i32> {Ok(self.as_qcolor())}/// 可变的可调用方法,存储颜色pub fn store_color(self: Pin<&mut Self>, red: f32, green: f32, blue: f32) {self.store_helper(red, green, blue);}/// QENUMS!pub fn store_color_with_enum(self: Pin<&mut Self>, color: qobject::Color) {use qobject::Color;let (r, g, b) = match color {Color::Red => (1.0, 0.0, 0.0),Color::Green => (0.0, 1.0, 0.0),Color::Blue => (0.0, 0.0, 1.0),_ => (0.0, 0.0, 0.0),};self.store_helper(r, g, b);}/// 无可变参数的可调用方法,重置颜色pub fn reset(self: Pin<&mut Self>) {self.store_helper(0.0, 0.4667, 0.7843);}
}
继承
可以通过 #[inherit] 属性访问基类上已存在的方法或信号。
有关文档,请参阅 继承页面。
说明符
生成的方法可以具有实现继承所需的 C++ 说明符。
C++ 关键字 | CXX-Qt 属性 |
---|---|
override | #[cxx_override] |
virtual | #[cxx_virtual] |
final | #[cxx_final] |
这些说明符作为方法签名上的属性指定。
rust
unsafe extern “RustQt” {
#[qinvokable]
#[cxx_override]
fn data(self: &CustomBaseClass, index: &QModelIndex, role: i32) -> QVariant;
}
### 信号
qsignal 属性用于在 extern "RustQt" 块中为 QObject 定义信号。```rust
unsafe extern "RustQt" {/// 当连接发生时发出的 Q_SIGNAL#[qsignal]fn connected(self: Pin<&mut RustSignals>, url: &QUrl);/// 当断开连接发生时发出的 Q_SIGNAL#[qsignal]fn disconnected(self: Pin<&mut RustSignals>);/// 当发生错误时发出的 Q_SIGNAL#[qsignal]fn error(self: Pin<&mut RustSignals>, message: QString);
}
对于 extern 块中的每个函数签名,CXX-Qt 将在相应的 QObject 上生成一个信号。如果函数有参数,它们将成为相应信号的参数。信号函数不需要手动实现。
如果信号在 QObject 的基类上定义,则可以使用 #[inherit],这将导致 CXX-Qt 访问基类中现有的 Q_SIGNAL。
完整示例可以在 qml 特性示例 中找到。
📝 注意:可以在信号上使用 `#[cxx_name="..."]` 和 `#[rust_name="..."]` 来声明 C++ 和 Rust 中的不同名称。
📝 注意:使用 `pub(self)` 作为信号的可见性允许声明私有信号。
连接到信号
对于每个信号,CXX-Qt 将生成两个方法来连接到它。
-
on_<signal_name>
-
connect_<signal_name>
on_<signal_name> 方法将处理函数作为参数,当信号发出时将调用该函数。该处理函数的第一个参数是发出信号的 QObject,其余参数是信号参数。
connect_<signal_name> 函数还接受 Qt 连接类型作为参数。
let connections = [qobject.as_mut().on_connected(|_, url| {println!("Connected: {}", url);}),qobject.as_mut().on_disconnected(|_| {println!("Disconnected");}),// 演示使用不同连接类型进行连接qobject.as_mut().connect_error(|_, message| {println!("Error: {}", message);},ConnectionType::QueuedConnection,),
];
qobject.as_mut().rust_mut().connections = Some(connections);
每个连接返回一个 QMetaObjectConnectionGuard,它是 QMetaObject::Connection 的 RAII 包装器,并在守卫被丢弃时自动断开连接。这类似于 C++ 的 std::lock_guard、std::unique_ptr 或 Rust 的 Box。
示例:
// 通过将 connections 设置为 None,我们触发连接的丢弃
// 这将导致断开连接
qobject.as_mut().rust_mut().connections = None;
如果你不想存储 QMetaObjectConnectionGuard,可以调用 release,这将将其转换为内部的 QMetaObjectConnection,它是 QMetaObject::Connection 的直接包装器,不会在丢弃时断开连接。
📝 注意:`QMetaObjectConnection` 有一个 `disconnect` 方法,可以稍后手动调用。
发出信号
调用 extern “RustQt” 块中定义的函数签名以发出信号。
请注意,这些函数是在生成的 QObject qobject::T 上定义的,因此可以从任何可变的 #[qinvokable] 中调用。
该函数将立即发出信号。根据连接类型,连接的槽将立即调用或从事件循环中调用(参见不同的连接类型)。要将调用排队到 Qt 事件循环的下一个周期,可以使用 CxxQtThread。
信号继承
如果信号在 QObject 的基类上定义,则可以使用 #[inherit] 属性来指示 CXX-Qt 不需要在 C++ 中创建 Q_SIGNAL。
unsafe extern "RustQt" {/// 从 QAbstractListModel 基类继承 DataChanged 信号#[inherit]#[qsignal]#[cxx_name = "dataChanged"]fn data_changed(self: Pin<&mut CustomBaseClass>,top_left: &QModelIndex,bottom_right: &QModelIndex,roles: &QVector_i32,);
}
相关文章:
【CXX-Qt】4.1 extern “RustQt“
QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心,用于声明 Rust 类型和签名,使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...
当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验
求人不如求己。 事情是这样的,前段时间,我看了本书,书里介绍了款应用,能计算财富自由价格,还能制定退休计划。 结果,我迫不及待去下载这个应用时,发现这应用功能残缺,完全不可用。 …...
如何排查C++程序的CPU占用过高的问题
文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…...
数据库练习
完善t_hero表 -- 添加作者字段 alter table t_hero add author varchar(100);-- 更新数据update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id…...
nodejs-原型污染链
还是老规矩,边写边学,先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…...
无人机与AI技术结合的突破性应用场景
1. 自主导航与动态避障 技术栈:SLAM 强化学习 (PPO算法) 代码示例(Python PyTorch): import torch class DronePPO(torch.nn.Module):def __init__(self):super().__init__()self.actor torch.nn.Sequential(torch.nn.Linear…...
jsBridge在vue中使用
创建jsBridge.js /* eslint-disable */ function connectWebViewJavascriptBridge (callback) {if (window.WebViewJavascriptBridge) {callback(window.WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady, function () { callback(wi…...
Windows下docker使用教程
docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的,后面的内容其实不变 …...
iOS:GCD信号量、同步、异步的使用方法
信号量的详细用法,可以用此方法进行队列管理 -(void)dispatchSignal{//crate的value表示,最多几个资源可访问dispatch_semaphore_t semaphore dispatch_semaphore_create(3);dispatch_queue_t quene dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI…...
Nginx相关漏洞解析
一、CRLF注入漏洞 原理:Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF 注入漏洞 1、开环境 2、访问网站,并抓包 3、构造请求头 %0ASet-cookie:JSPSESSID%3D1 这样就可以…...
SpringCloud构建一个服务步骤
Spring Cloud是一个用于构建分布式系统的开源框架,可以帮助开发者快速构建各种云原生应用。下面是一个简单的步骤,展示如何使用Spring Cloud构建一个服务: 创建一个Spring Boot项目:首先需要创建一个Spring Boot项目作为基础。可以…...
MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...
MinGW与使用VScode写C语言适配
压缩包 通过网盘分享的文件:MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面,从上数第4个,点击扩展(以下通此) 搜索---Chinese--点击---安装--o…...
k8s存储介绍(五)PV与PVC
在 Kubernetes(k8s)中,持久化存储(Persistent Storage)是一个非常重要的概念,因为 Pod 本身是无状态的,重启后会丢失数据。为了支持有状态应用,Kubernetes 提供了持久化存储的机制&a…...
LangChain开发(五)消息管理与聊天历史存储
文章目录 消息存储在内存使用单参数session_id配置会话唯一键 消息持久化到redis安装redis依赖安装redis调用聊天接口,看Redis是否存储历史记录 裁剪消息总结记忆源码地址参考资料 消息存储在内存 我们展示一个简单的示例,其中聊天历史保存在内存中&…...
HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)
引言 在前端开发的广袤领域中,HTML 表单处理堪称基石般的存在,是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单,到功能多样的搜索栏、反馈表单,HTML 表单如同桥梁,紧密连接着用户与 Web 应用…...
【文献25/03/26】Hyperspectral Image Transformer Classification Networks
高光谱图像Transformer分类网络 Hyperspectral Image Transformer Classification Networks | IEEE Journals & Magazine | IEEE Xplore 摘要 高光谱图像(HSI)分类是地球观测任务中的一项重要工作。 卷积神经网络(CNN)凭借…...
数字转换(c++)
【题目描述】 如果一个数 xx 的约数和 yy (不包括他本身)比他本身小,那么 xx 可以变成 yy ,yy 也可以变成 xx 。例如 44 可以变为 33 ,11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行,…...
WPF ContentPresenter详解2
ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件,但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl:位于 WPF 控件…...
【git】认识git的本地仓库
1.创建本地仓库 git init2. 配置本地仓库 git config user.name xxx git config user.email xxx3. 认识本地仓库 创建完本地仓库后,目录下会有一个.git文件,这个就是本地仓库 而创建本地仓库的目录叫做工作区,我们不能对.git文件进行任何手…...
正则表达式基本语法和Java中的简单使用
先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...
【大模型】什么是循环神经网络(RNNs)
在人工智能(AI)的世界里,**循环神经网络(Recurrent Neural Networks, RNNs)**是一种非常强大的工具,特别适合处理序列数据。无论是语言、时间序列还是音乐,RNNs都能帮助我们理解和预测这些数据的…...
Leetcode 交错字符串
java solution class Solution {public boolean isInterleave(String s1, String s2, String s3) {//首先获取这三个字符串的长度int m s1.length();int n s2.length();int l s3.length();if(m n ! l) return false;//创建dp数组,dp[i][j]其含义是s3的前ij个字符是否可以由…...
Vue动态绑定:文本框、单选按钮、下拉列表、多选按钮
Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...
MySQL - 数据库基础操作
SQL语句 结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language),定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…...
从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!
引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…...
关于优麒麟ukylin如何更换清华源以及ubuntu24.04安装gcc-i686-linux-gnu找不到包的问题
打算把这个文章当成一个调试Linux bug的汇总,会持续更新 1、关于优麒麟ukylin如何更换清华源 (1)首先打开命令行,切换root权限 su root 输入密码 如果第一次使用ubuntu会提示密码不正确,输入 sudo passwd root …...
Spring Boot 自定义 Starter 组件的技术指南
1、简述 Spring Boot 通过 Starter 机制,让开发者可以快速集成第三方组件。在企业级开发中,我们常常需要封装自己的 Starter 组件,以提高代码复用性,简化配置,并实现可插拔的模块化开发。 Spring Boot Starter 机制 …...
基于Spring Boot的ONLY在线商城系统设计与实现的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
HarmonyOS 之 @Require 装饰器自学指南
在 HarmonyOS 应用开发工作中,我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里,要是无法确保必要参数在构造时准确传入,就极易引发运行时错误,而且排查起来费时费力。一次偶然的机会,我接触到了 Require 装饰…...
【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典
更新日期:2025年3月26日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、SerializableDictionary可序列化字典1.使用SerializableDictionary2.实现思路 二、Serializ…...
JavaScript的性能优化指导
JavaScript 的性能优化可以从多个层面入手,涵盖代码执行效率、内存管理、DOM 操作、网络请求等。以下是一些关键优化策略: 一、代码执行优化 减少作用域链查找 避免在循环中频繁访问全局变量或深层嵌套的属性,将其缓存到局部变量中。 // 优化…...
如何在 Vue 项目中使用v - for指令进行列表渲染,如何优化其性能?
大白话如何在 Vue 项目中使用v - for指令进行列表渲染,如何优化其性能? 在Vue项目里,咱们常常会碰到要把一组数据渲染成列表的状况。这时候,v-for指令就派上大用场啦!它能让咱们轻松地把数据数组里的每个元素渲染成对…...
Notepad++ 替换 换行符 为 逗号
多行转一行,逗号分隔 SPO2025032575773 SPO2025032575772 SPO2025032575771 SPO2025032575771 SPO2025032575770为了方便快速替换,我们需要先知道这样类型的数据都存在哪些换行符。 点击【视图】-【显示符号】-【显示行尾符】 对于显示的行尾换行符【C…...
《基于机器学习发电数据电量预测》开题报告
个人主页:大数据蟒行探索者 目录 一、选题背景、研究意义及文献综述 (一)选题背景 (二)选题意义 (三)文献综述 1. 国内外研究现状 2. 未来方向展望 二、研究的基本内容,拟解…...
【Linux】MAC帧
目录 一、MAC帧 (一)IP地址和MAC地址 (二)MAC帧格式 (三)MTU对IP协议的影响、 (四)MTU对UDP协议的影响 (五)MTU对TCP协议的影响 二、以太网协议 &…...
企业入驻成都国际数字影像产业园,可享150多项专业服务
企业入驻成都国际数字影像产业园,可享150多项专业服务 全方位赋能,助力影像企业腾飞 入驻成都国际数字影像产业园,企业将获得一个涵盖超过150项专业服务的全周期、一站式支持体系,旨在精准解决企业发展各阶段的核心需求…...
飞速(FS)企业网布线解决方案:赋能能源行业客户高效网络部署与智能化管理
国家:中国 行业:能源与公用事业 网络类型:楼宇主干局域网 方案类型:企业网络布线 案例亮点 部署高密度、高性能飞速(FS)24口千兆企业级交换机,有效节省客户机房安装空间,提高并发…...
前端性能优化方案总结
首屏加载优化 把老版本的库替换成新版本,支持tree shaking的库,按需引入,只打包用到的部分,大大优化项目体积,加快项目的首屏渲染。 能不用第三方库,就不用第三方库,比如时间格式化,…...
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差(MMSE)检测算法 4.4 迫零(ZF)检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …...
[plugin:vite:import-analysis] Cannot find module ‘vuex\dist\vuex.esm-bundler
我的是升级了uview-plus版本,导致一直报错,即时将版本降回去也报错,需要将package-lock.json和package-lock.yaml文件删掉重新安装软件包...
用Deepseek + Kimi 快速生成高质量的ppt
AI系列文章: AWS AI认证考试中经常提及几个重要的工具介绍 简单理解机器学习中top_k、top_p、temperature三个参数的作用 用Deepseek Kimi 快速生成高质量的ppt 在职场,不管干什么,都少不了和 PPT 打交道:客户交流,…...
【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码
本章目录 1. sync.Mutex锁的基本用法2. sync.Mutex的核心原理自旋到阻塞的升级过程自旋CAS 饥饿模式 3. sync.Mutex底层源码Mutex结构定义全局常量Mutex.Lock()方法第一次CAS加锁能够成功的前提是?竞态检测 Mutex.lockSlow()lockSlow的局部变量自旋空转state新值构造…...
Maven入门
1、简介 Apache Maven是一个项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 2、作用 1)依赖导…...
SpringCloud Stream:消息驱动的微服务架构设计
文章目录 引言一、Spring Cloud Stream基础概念二、核心组件和架构三、消息生产者实现四、消息消费者实现五、消息分组与持久化六、消息分区与扩展七、函数式编程模型八、错误处理与重试机制九、测试与监控总结 引言 在当今复杂的分布式系统环境中,微服务架构已经成…...
进程通信(进程池的模拟实现) read write函数复习 Linux ─── 第23课
目录 进程池(process pool) 第一步: 创建并初始化processpool 第二步:主进程对子进程派发任务 补充: 第三步: 子进程执行完退出进程池 回收子进程 进程池的实现 Channel.hpp ProcessPool.hpp Task.hpp main.cc makefile 匿名管道的应用: 进程池 进程池(process po…...
Docker技术全景解析
一、Docker是什么 1.1 定义 Docker是一种容器化技术平台,它通过操作系统级别的虚拟化,将应用程序及其依赖打包成标准化的可移植单元(容器)。这种技术实现了: 环境一致性:消除“在我机器上能跑”的问题进…...
23种设计模式-状态(State)设计模式
状态设计模式 🚩什么是状态设计模式?🚩状态设计模式的特点🚩状态设计模式的结构🚩状态设计模式的优缺点🚩状态设计模式的Java实现🚩代码总结🚩总结 🚩什么是状态设计模式…...
【计算机网络运输层详解】
文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…...
C# 多标签浏览器 谷歌内核Csharp
采用框架 :FBrowserCEF3lib 视频演示:点我直达 成品下载: https://wwms.lanzouo.com/iYOd42rl8vje...