Qt5操作Office及Word读写实例

news/2024/5/19 19:14:30/文章来源:https://blog.csdn.net/weixin_44759598/article/details/128463948

欢迎小伙伴的点评✨✨,相互学习🚀🚀🚀
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀

文章目录

  • 前言
  • 一、Qt操作Office的基本方式
    • 1.1、QAxObject对象访问
      • 1.1.1、操作Excel的基本流程
      • 1.1.2、操作Word的基本流程
  • 二、AxWidget界面显示
  • 三、Qt 对 Office 的基本读写
    • 3.1、程序界面
    • 3.2、效果实例
    • 3.3、原码解析
      • mainwindow.h
      • main.cpp
      • mainwindow.cpp
  • 总结


前言

本节将会给大家带来Qt连接Office读写及Word读写的实例


一、Qt操作Office的基本方式

与其他高级语言平台一样, Qt 也提供了访问 Office 文档的功能,可实现对 Mircosoft Office
套件(包括 Excel 、 Word 等)的访问和灵活操作。
Qt 可在程序中直接操作读写 Office 中的数据,也可以通过控件将 Office 文档中的数据显示
在应用程序图形界面上供用户预览。

QAxObject 是 Qt 提供给程序员从代码中访问 Office 的对象类,其本质上是一个面向微软操作系统的 COM 接口,它操作 Excel 和 Word 的基本流程分别如下图所示。 QAxObject将所有 Office 的工作簿、表格、文档等都作为其子对象,程序员通过调用 querySubObject()这个统一的方法来获取各个子对象的实例,再用 dynamicCall()方法执行各对象上的具体操作。
为了能在 Qt 项目中使用 QAxObject 和 QAxWidget 对象,对于每个需要操作 Office 的 Qt 程
序项目都要进行配置,在项目的 .pro 文件中添力语句如下

QT       +=axcontainer

图示如下
在这里插入图片描述

1.1、QAxObject对象访问

1.1.1、操作Excel的基本流程

Excel.Application(创建Excel进程)WorkBooks(工作薄集)WorkBook(工作薄)Sheets(表格集)querySubObject(1){ 访问文档 xx.xls }querySubObject(2){ 访问表 Sheets }querySubObject(3){ 访问表单元格 cell }Excel.Application(创建Excel进程)WorkBooks(工作薄集)WorkBook(工作薄)Sheets(表格集)

(1) 启动Excel进程、获取Excel工作薄集。
创建 Excel 进程使用如下语句:

QAxObject *myexcel = new QAxObject{"Excel.Application");

其中, myexcel 为进程的实例对象名,该名称由用户自己定义,整个程序中引用一致即可。
通过进程获取 Excel 工作簿集,语句为:

QAxObject *myworks = myexcel->querySl.ibObject("WorkBooks");

其中, myworks 是工作簿集的引用,用户可根据需要定义其名称,同样 , 在程序中也要求引用 一致 。
有了 Excel 进程和工作簿集的引用,就可以使用它们对 Excel 进行一系列文档级别的操作,例如:

myworks->dynamicCall("Add");  //添加一个工作簿
myexcel->querySubObject("ActiveWorkBook"); //获取当前活动的工作簿

(2) 获取电子表格集 。
每个 Excel 工作簿中都可以包含若干电子表格 (Sheet), 通过打开的当前工作簿获取其所有电子表格的程序语句为:

QAxObject *mysheets = workbook->querySubObject("Sheets");

其中, workbook 也是一个 QAxObject 对象,引用的是当前正在操作的 一个活动工作簿 。
同理,在获取了电子表格集后,就可以像操作工作簿文档那样,对其中的表格执行各种操作,例如:

mysheets->dynamicCall ("Add");           ///添加一个表格
workbook->querySubObject("ActiveSheet");  //获取工作簿中当前活动表格
sheet->setProperty("Name", "字符串");     //给表格命名

其中, sheet 也是个 QAxObject 对象,代表当前所操作的表格 。
(3) 操作单元格及其数据 。
对 Excel 的操作最终要落实到对某个电子表格单元格中数据信息的读写上,在 Qt 中的 Excel
单元格同样是作为 QAxObject 对象来看待的,对它的操作通过其所在表格的 QAxObject 对象句
柄执行,如下:

QAxObject *cell= sheet->querySubObjec 七 ("Range (QVariant, QVariant)",单元格编号);
cell->dynamicCall("SetValue(const QVariant&)", QVariant("字符串");

这样,就实现了对 Excel 各个级别对象的灵活操作和使用。
为避免资源无谓消耗和程序死锁,通常在编程结束时还必须通过语句释放该 Excel 进程所占据的系统资源,如下:

workbook->dynamicCall("Close()");    //关闭工作薄
myexcel->dynamicCall ("Quit()");     //退出进程

1.1.2、操作Word的基本流程

Word.Application(创建Word进程)Documents(文档集)Doc(文档)querySubObject(1){ 访问文档 xx.doc }querySubObject(2){ 访问 文本 }Word.Application(创建Word进程)Documents(文档集)Doc(文档)

(1) 启动Word 进程、获取Word文档集。
创建 Word 进程使用如下语句:

QAxObject *myword = new QAxObject("Word.Application");

其中, myword 为进程的实例对象名,该名称由用户自己定义,整个程序中引用一致即可。
通过进程获取 Word 文档集,语句为:

QAxObject *mydocs = myword->querySubObject("Documents");

其中, mydocs 是文档集的引用,用户可根据需要定义其名称,同样,在程序中也要求引用一致。
有了 Word 进程和文档集的引用,就可以使用它们对 Word 文档执行操作,例如:

mydocs->dynamicCall("Add(void)");    //添加一个新文档
myword->querySubObject("ActiveDocument");  //获取当前打开的活动文档

(2)获取和操作当前选中的段落。
一个 Word 文档由若干文本段落构成,通过文档句柄可对当前选中的段落执行特定的操作,如下:

QAxObject *paragraph= myword->querySubObject("Selection");

其中, paragraph 是一个 QAxObject 对象,引用的是当前所选中将要对其执行操作的 一个段落文本。
下面举两个操作 Word 文档段落的语句,如下:

paragraph->dynamicCall("TypeText(const QString&)", "字符串");  //写入文本字符串
paragraph = document->querySubObject("Range()");  //获取文本
QString str = paragraph->property("Text") .toString();  //读出文本字符串

其中, document 是 一个表示当前活动文档的 QAxObject 对象。
同样,在使用完 Word 文档之后也要进行释放资源和关闭进程的善后处理,如下:

document->dynamicCall("Close()");   //关闭文档
myword->dynamicCall("Quit()");     //退出进程

二、AxWidget界面显示

除用程序代码中的 QAxObject 对象直接操作 Office 外, Qt 还支持用户在应用程序界面上实时地显示和预览 Office 文档的内容,这通过 Qt 中的 QAxWidget 对象来实现。它的机制是:将桌面程序界面上的某个 Qt 控件重定义包装为专用于显示 Office 文档的 QAxWidget 对象实例,该实例与用户程序中所启动的特定 Office 进程相关联,就具备了显示外部文档的增强功能,本质上就是用 Qt 的组件调用外部的 Microsoft Office 组件,实际在后台执行功能的仍然是 Microsoft Office 的 COM 组件。例如,将一个 Qt 的标签 (QLabel) 控件绑定到 Excel 进程来显示表格的程序代码如下:

    QAxWidget * mywidget = new QAxWidget("Excel.Application", ui->label);mywidget->dynamicCall("SetVisible(bool Visible)", "false");//隐藏不显示 Office 窗体mywidget->setProperty("DisplayAlerts", false); //屏蔽 Office 的警告消息框mywidget->setGeometry(ui->label->geometry().x() , ui->label->geometry().y(),1000,500); //设置显示区尺寸mywidget->setControl("D:\\QT application  code  file\\File_Qt\\Qt5.xls"); //指定要打开的文件名路径mywidget->show (); //显示内容

图示
在这里插入图片描述

三、Qt 对 Office 的基本读写

Excel 软件具有完善的电子表格处理和计算功能,可在表格特定行列的单元格上定义公式,对其中的数据进行批量运算处理,用 Qt 操作 Excel 可辅助执行大量原始数据的计算功能,巧妙地借助单元格的运算功能就能极大地减轻 Qt 程序本身的计算负担。 Word 是最为常用的办公软件,很多日常工作资料都是以 Word 文档格式保存的。用 Qt 既可以对 Word 中的文字也可以对表格中的信息进行读写。

3.1、程序界面

创建一个 Qt 桌面应用程序项目, 为了方便对比 Qt 对两种不同类型文档的操作,设计程序界面, Qt 对 Office 基本读写程序界面如下图 所示。
图示
在这里插入图片描述
上图界面上各控件的名称及控件类型

序号控件名称控件类型
1labelQLabel
1lineEditQLineEdit
1pushButtonQPushButton
2label_2QLabel
2lineEdit _2QLineEdit
2pushButton_2QPushButton
3label_3QLabel
3lineEdit_3QLineEdit
3pushButton_3QPushButton
4label_4QLabel
4lineEdit_4QLineEdit
4pushButton_4QPushButton

按钮鼠标右键 “转到槽” 选择 clicked()如下图所示
在这里插入图片描述

在这里插入图片描述
控件如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2、效果实例

图一
在这里插入图片描述
图二

在这里插入图片描述

3.3、原码解析

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QMessageBox>
#include <QAxObject>                //访问Office对象类
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();    /*写入数据到Excel单机事件按钮*/void on_pushButton_2_clicked();  /*读取Excel单机事件按钮*/void on_pushButton_3_clicked();  /*写入数据到Word单机事件按钮*/void on_pushButton_4_clicked();  /*读取Word单机事件按钮*/private:Ui::MainWindow *ui;/*Excel读写指针*/QAxObject *myexcel;      //Excel 应用程序指针QAxObject *myworks;      //工作薄集指针QAxObject *workbook;     //工作薄指针QAxObject *mysheets;     //电子表格集指针/*Word读写指针*/QAxObject *myword;       //Word应用程序指针QAxObject *mydocs;       //文档集指针QAxObject *document;     //文档指针QAxObject *paragraph;    //文本段指针};#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}/*将控件lineEdit写入数据到Excel*/
void MainWindow::on_pushButton_clicked()
{myexcel = new QAxObject ("Excel.Application");myexcel->dynamicCall("SetVisible(bool Visible)", "false");//隐藏不显示文档窗体myexcel->setProperty("DisplayAlerts", false); //屏蔽文档的警告消息框myworks = myexcel->querySubObject("WorkBooks");  //获取工作薄集myworks->dynamicCall("Add");                     //添加工作薄workbook= myexcel->querySubObject("ActiveWorkBook"); //获取当前活动工作薄mysheets = workbook->querySubObject("Sheets");  //获取电子表格集mysheets->dynamicCall ("Add"); //添加一个表QAxObject *sheet= workbook->querySubObject("ActiveSheet");  //指向当前的活动表格sheet->setProperty ("Name", "我爱 Qt");                     //给表格命名QAxObject *cell= sheet->querySubObject ("Range (QVariant, QVariant) ", "C3"); //指向C3单元格QString  inStr = ui->lineEdit->text();    //从lineEdit控件获得数据cell->dynamicCall("SetValue(const QVariant&)", QVariant(inStr)); //向单元格写入内容sheet= mysheets->querySubObject("Item(int)", 2);  //指向第二个表格sheet->setProperty ("Name", "Hello Qt");          //给表格命名cell= sheet->querySubObject("Range(QVariant, QVariant)", "B5"); //指向B5单元格cell->dynamicCall ("SetValue(const QVariant&)", QVariant ("Hello Qt!"));  //向单元格写入内容workbook->dynamicCall("SaveAs(const QString&) ", "D:\\QT application  code  file\\File_Qt\\Qt5.xls");//Excel(Qt5.xls)保存到指定路径workbook->dynamicCall("Close()"); //关闭myexcel->dynamicCall ("Quit()");  //退出QMessageBox::information(this, tr("完毕"), tr("Excel 工作表已保存")) ;ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(true);
}/*从Excel读取数据到lineEdit_2控件*/
void MainWindow::on_pushButton_2_clicked()
{myexcel = new QAxObject("Excel.Application");myexcel->dynamicCall("SetVisible(bool Visible)", "false");//隐藏不显示文档窗体myexcel->setProperty("DisplayAlerts", false); //屏蔽文档的警告消息myworks = myexcel->querySubObject("WorkBooks"); //获取工作薄集myworks->dynamicCall ("Open(const QString&)","D:\\QT application  code  file\\File_Qt\\Qt5.xls");//打开Excelworkbook= myexcel->querySubObject("ActiveWorkBook");  //获取当前活动工作薄mysheets = workbook->querySubObject("WorkSheets");    //获取当前电子表QAxObject *sheet= workbook->querySubObject("Sheets(int)", 1); //指向第一个表格QAxObject *cell= sheet->querySubObject ("Range (QVariant, QVariant) ", "C3");QString outStr = cell->dynamicCall ("Value2()").toString(); //读出C3单元格内容;ui->lineEdit_2->setText(outStr);sheet= workbook->querySubObject("Sheets(int)", 2); //指向第二个表格cell= sheet->querySubObject("Range(QVariant, QVariant)", "B5"); //outStr = cell->dynamicCall ("Value2()").toString(); //读出 B5 单元格内容workbook->dynamicCall("Close()");myexcel->dynamicCall ("Quit()");QMessageBox::information(this, tr("消息"), outStr);ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);}/*将写lineEdit_3控件数据写到Word*/
void MainWindow::on_pushButton_3_clicked()
{myword = new QAxObject("Word.Application");myword->dynamicCall("SetVisible(bool Visible)", "false");//隐藏不显示文档窗体myword->setProperty("DisplayAlerts", false); //屏蔽文档的警告消息mydocs = myword->querySubObject("Documents");  //获取文档集mydocs->dynamicCall("Add(void)");              //添加一个文档document= myword->querySubObject("ActiveDocument"); //指向当前活动文档paragraph = myword->querySubObject ("Selection") ; //指向当前选中文本QString inStr = ui->lineEdit_3->text();paragraph->dynamicCall("TypeText(const QString&)", inStr);//写入从界面文本框获取的文本paragraph->dynamicCall ("TypeText (const QVariant&) ", QVariant ("\nHello Qt!")) ;//写入指定的文本document->dynamicCall("SaveAs(const QString&)","D:\\QT application  code  file\\File_Qt\\Qt5.doc");//保存文档delete paragraph;paragraph= nullptr;document->dynamicCall("Close()");myword->dynamicCall("Quit()");QMessageBox::information(this, tr("完毕") , tr("Word 文档己保存")) ;ui->pushButton_3->setEnabled(false);ui->pushButton_4->setEnabled(true);}void MainWindow::on_pushButton_4_clicked()
{myword = new QAxObject("Word.Application");myword->dynamicCall("SetVisible(bool Visible)", "false"); //隐藏不显示文档的窗体myword->setProperty("DisplayAlerts", false); //屏蔽文档的警告消息mydocs = myword->querySubObject("Documents"); //获取文档集mydocs->dynamicCall("Open(const QString&)","D:\\QT application  code  file\\File_Qt\\Qt5.doc");//打开文档document= myword->querySubObject("ActiveDocument"); //指向活动文档paragraph = document->querySubObject ("Range()"); //指向当前文本QString outStr = paragraph->property("Text").toString () ; //读出文本ui->lineEdit_4->setText(outStr.split("H").at(0));paragraph= document->querySubObject("Range(QVariant, QVariant)", 4, 15);/* 由于 Word 文档中共有两行文本,而 Qt 一次性读出的
是所有文本(并不自动分行分段),为了能分行输出,我们运用了 splitO方法分隔以及索引截取
字符串的编程技术。*/outStr = paragraph->property("Text").toString();delete paragraph;paragraph= nullptr;document->dynamicCall ("Close()");myword->dynamicCall("Quit()");QMessageBox::information(this, tr("消息"),outStr) ;ui->pushButton_4->setEnabled(false);ui->pushButton_3->setEnabled(true);}

总结

Excel 软件具有完善的电子表格处理和计算功能,可在表格特定行列的单元格上定义公式,对其中的数据进行批量运算处理,用 Qt 操作 Excel 可辅助执行大量原始数据的计算功能,巧妙地借助单元格的运算功能就能极大地减轻 Qt 程序本身的计算负担。
故Qt5操作Office及Word读写在应用开发中是经常用到的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_240805.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法-java

什么是数组&#xff1f; &#xff08;1&#xff09;数组是计算机中最基本的数据结构之一&#xff0c;我们会用一些名为索引的数字来标识每项数据在数组中的位置。 &#xff08;2&#xff09;大多数编程语言中索引是从0开始的。 &#xff08;3&#xff09;数组在内存中是存在连续…

【真干货】Activiti7工作流如何使用?看这里

一. 前言 近日文哥有个毕业学员在公司开发时遇到了工作流的相关业务场景。在这里&#xff0c;文哥给大家精心准备了以Activiti为代表的工作流简单使用教程&#xff0c;希望能给有需要的小伙伴们一些帮助。下面我们就来开始介绍Activiti工作流的基本使用情况。 二. Activiti工…

常见的5种数据分析方法有哪些?

看大家介绍了那么那么多的数据分析方法&#xff0c;但不同的数据分析方法使用场景不同&#xff0c;A常用的B不一定常用。 所以这篇只介绍5种基于逻辑层面的&#xff0c;几乎人人都会用的数据分析方法。 先来分享一下数据分析6大步骤&#xff1a; 按照这6个步骤&#xff0c;结合…

Hadoop 的基础知识

Hadoop 的基础知识1. Hadoop 简介2. Hadoop 的发展简史3. Hadoop 现状4. Hadoop 特性优点5. Hadoop 发行版本6. Hadoop 架构变迁7. Hadoop 集群集体概念1. Hadoop 简介 Hadoop 官网: https://hadoop.apache.org/ Apache Hadoop 软件库是一个框架, 是 Apache 软件基金会的一款开…

SpringBoot 自动装配原理,一文掌握!|原创

本文详细讲解了 SpringBoot 自动装配原理&#xff0c;可以直接拉到最后看总结。由于 Spring 源码比较复杂&#xff0c;是需要一些基础的。如果有不懂的地方&#xff0c;欢迎提问&#xff01;点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达…

【微信小程序项目的基本组成结构】

项目的基本组成结构 ├── app.js # 小程序的逻辑文件 ├── app.json # 小程序的配置文件 ├── app.wxss # 全局公共样式文件 ├── pages # 存放小程序的各个页面 │ ├── index # index页面 │ │ ├── index.js # 页面逻辑 │ │ ├── index.wxml # 页面结构 │…

亿级流量的互联网项目如何快速构建?手把手教你构建思路

一. 大流量的互联网项目 1.项目背景 索尔老师之前负责的一个项目&#xff0c;业务背景是这样的。城市的基础设施建设是每个城市和地区都会涉及到的&#xff0c;如何在基建工地中实现人性化管理&#xff0c;是当前项目的主要诉求。该项目要实现如下目标&#xff1a; 工地工人的…

2022年底了,你们公司还好吗?我这里不太好

以下这些也是和几个朋友聊天的时候慢慢聊出来的&#xff0c;不一定真实啊&#xff0c;当做大家开发累了以后的一点调味剂吧 一、宇宙厂 1.宇宙人员成本优化计划&#xff0c;随着各个业务确认了优化目标&#xff0c;将在接下来陆续开展。 某中台确认了指标&#xff0c;将在“在职…

【蓝桥杯备赛系列 | 简单题】素数判断 字符串输入输出

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 蓝桥杯竞赛专栏 | 简单题系列 &#xff08;一&#xff09; 作者&#xff1a; 计算机魔术师 版本&#xff1a; 1.0 &#xff08…

搭建免费内网穿透

1&#xff0c;参考&#xff1a; https://news.cndns.com/ArticlesDetail/articlesdel/id/8654https://news.cndns.com/ArticlesDetail/articlesdel/id/8654 2&#xff0c;搭建Ngrok 官网&#xff1a; https://www.ngrok.cc/https://www.ngrok.cc/ &#xff08;1&…

[网鼎杯 2020 白虎组]PicDown(任意文件读取)

打开界面发现有一个get传参然后&#xff0c;尝试任意文件读取漏洞&#xff0c;/etc/passwd看一下,提示下载了一个jpg图片然后 打不开只能用 010查看一下信息 看来是猜对了&#xff0c;然后 如果日记没删掉可以查看历史记录 .bash_history呃呃呃差不到&#xff0c;那就看一下现…

【Lilishop商城】No4-3.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-微信小程序登录接口开发

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代码…

第十六讲:神州交换机访问控制列表的配置

访问控制列表ACL&#xff08;Access Control Lists&#xff09;数据定义工具&#xff0c;基于用户自行定义的数据的参数区分不同的数据流&#xff0c;是在交换机和路由器上经常采用的一种防火墙技术&#xff0c;它可以对经过网络设备的数据包根据一定规则进行过滤。它有以下一些…

#5文献学习总结--利用多级反馈排队的雾计算框架中的期限和优先级感知任务卸载

文献&#xff1a;DPTO: A Deadline and Priority-aware Task Offloading in Fog Computing Framework Leveraging Multi-level Feedback Queueing 延迟相关优先级感知卸载&#xff08;DPTO&#xff09;策略&#xff0c;基于任务的最后期限为每个任务分配优先级&#xff0c;并将…

C#,图像二值化(06)——全局阈值的大津OTSU算法及其源代码

1、大津OTSU算法 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的&#xff0c;是一种自适应阈值确定的方法&#xff0c;又叫大津法&#xff0c;简称OTSU&#xff0c;是一种基于全局的二值化算法&#xff0c;它是根据图像的灰度特性,将图像分为前景和背景两个部分。…

rocketmq 实战问题汇总

rocketmq 实战过程会遇到这样或者那样的问题&#xff0c;今天我们专门抽出一篇文章来分析一下汇总一下&#xff0c;避免以后踩同样的坑&#xff1a; 1、找不到JDK的问题&#xff1a; 综合分析&#xff0c;是因为JDK安装的目录有空格导致的&#xff1a;Program Files 两个单词之…

YOLO-V5 系列算法和代码解析(三)—— 训练数据加载

文章目录调试准备Debug 设置代码修改调试数据代码运行逻辑类初始化启动迭代器数据增强调试准备 为了便于阅读代码和打印中间变量&#xff0c;需进行调试模式下运行代码。配置平台&#xff1a;Ubuntu&#xff0c;VSCode。在上一篇博文中&#xff0c;我们简单探讨过调试的设置。在…

JavaScript手写响应式原理(详解)

响应式原理 首先我们有一个对象 const obj {name: zlk,age: 18}这个对象可能在别处被用到 比如是这样的 function foo() {const newValue obj.nameconsole.log(hello world);console.log(obj.name);}我们来改变obj对象中的name的值 obj.name zlk这时候foo()应该被重新执…

一文读懂bert结构。

最近承接了项目要复现tiny_Bert。所以在这里用文章记录自己学到的。这篇文章是前置&#xff0c;主要介绍bert原理。 下一篇文章介绍tinybert的原理和训练 模型介绍&#xff1a; BERT概述&#xff1a; 如果要介绍tinyBERT&#xff0c;首先我们需要了解BERT模型。&#xff08;了…

原神私服搭建教程 (最新版)

搭建教程 1.准备阶段 1.请先确保电脑内有这些安装环境&#xff0c;否则私服无法运行&#xff01;&#xff01;&#xff01; MongoDB Python3.8 java17 mitmproxy 没有请在群文件下载安装环境&#xff0c;安装即可。特别强调&#xff1a;java17直接放在C:\Program Files目录下即…