当前位置: 首页 > news >正文

QCefView应用和网页的交互

一、demo的主要项目文件
结合QCefView自带的demo代码

main.cpp

#include
#include <QCefContext.h>
#include “MainWindow.h”
int
main(int argc, char* argv[])
{
QApplication a(argc, argv);
// build QCefConfig
QCefConfig config;
config.setUserAgent(“QCefViewTest”);
config.setLogLevel(QCefConfig::LOGSEVERITY_DEFAULT);
///桥对象表示一个Javascript对象,它将被插入
///进入所有的浏览器和框架。该对象被指定用于通信
///在web内容中的Javascript和本地上下文(C/ c++)代码之间。
///该对象被设置为window对象的属性。这意味着它可以
///通过调用window获取。Javascript代码中的bridgeObject
config.setBridgeObjectName(“QCefClient”);//这个很关键
config.setRemoteDebuggingPort(9000);
config.setBackgroundColor(Qt::lightGray);
// WindowlessRenderingEnabled is set to true by default, set to false to disable the OSR mode
// config.setWindowlessRenderingEnabled(false);
// add command line args
config.addCommandLineSwitch(“use-mock-keychain”);
// config.addCommandLineSwitch(“disable-gpu”);
// config.addCommandLineSwitch(“enable-media-stream”);
// config.addCommandLineSwitch(“allow-file-access-from-files”);
// config.addCommandLineSwitch(“disable-spell-checking”);
// config.addCommandLineSwitch(“disable-site-isolation-trials”);
// config.addCommandLineSwitch(“enable-aggressive-domstorage-flushing”);
config.addCommandLineSwitchWithValue(“renderer-process-limit”, “1”);
config.setCachePath(QCoreApplication::applicationDirPath());
// config.addCommandLineSwitchWithValue(“disable-features”, “BlinkGenPropertyTrees,TranslateUI,site-per-process”);
// initialize QCefContext instance with config
QCefContext cefContext(&a, argc, argv, &config);
MainWindow w;
w.show();
return a.exec();
}
customcefview.h

#ifndef CUSTOMCEFVIEW_H
#define CUSTOMCEFVIEW_H

#include <include/QCefView.h>
#include “configurationTool/configuration.h”
#include “MessageDistribution.h”

class CustomCefView : public QCefView
{
Q_OBJECT

public:
CustomCefView(const QString& url, QWidget *parent);
~CustomCefView();

/*通过事件注册的方式,将消息发送给JS*/
void changeColor(); // 背景颜色发生改变
void languageChange(QString language); // 语言发生改变的槽函数

/接收JS端发送给Qt的消息/
protected slots:
virtual void onQCefUrlRequest(const QString& url) override;
virtual void onQCefQueryRequest(const QCefQuery& query) override;
virtual void onInvokeMethodNotify(int browserId, int frameId, const QString& method, const QVariantList& arguments) override;
void onLoadingStateChanged(bool isLoading, bool canGoBack, bool canGoForward) override;
void onLoadStart() override;
void onLoadEnd(int httpStatusCode) override;
void onLoadError(int errorCode, const QString &errorMsg, const QString &failedUrl) override;
private:
Configuration configuration; // 通讯配置工具
MessageDistributionHandle msgHandle;// 消息分发处理
};

#endif // CUSTOMCEFVIEW_H
对应的customcefview.cpp 中,我们来看如何实现事件注册,以及接收到JS消息后,Qt如何处理的:

#include <windows.h>
#include
#include
#include “customcefview.h”

CustomCefView::CustomCefView(const QString& url, QWidget* parent)
QCefView(url, parent)
{
}

CustomCefView::~CustomCefView() {}

/// 注册一个窗体颜色改变的事件==》Qt发送消息到网页端,网页端接受该事件消息后响应
void CustomCefView::changeColor()
{
qsrand(::GetTickCount());
QColor color(qrand());

//
QCefEvent event(“colorChangedEvent”);
event.setStringProperty(“color”, color.name()); // 定义事件属性参数
broadcastEvent(“colorChange”, event); // 广播事件
/
/
}

注册一个语言槽函数
void CustomCefView::languageChange(QString language) {
QCefEvent event(“languageChangedEvent”);
event.setStringProperty(“language”, language);
broadcastEvent(“languageChange”, event);
}

void CustomCefView::onQCefUrlRequest(const QString& url)
{
QString title(“QCef Url Request …[function] onQCefUrlRequest”);
QString text = QString(“Current Thread: QT_UI\r\n”
“Url: %1”)
.arg(url);

QMessageBox::information(this->window(), title, text);
}

/// 接收由JS发送过来的消息并回包
void CustomCefView::onQCefQueryRequest(const QCefQuery& query)
{
QString title(“QCef Query Request”);
QString text = QString(“Current Thread: QT_UI\r\n”
“Query: %1”)
.arg(query.reqeust());

QMessageBox::information(this->window(), title, text);

QString response = query.reqeust().toUpper();
query.setResponseResult(true, response);
responseQCefQuery(query);
}

/// 接受由JS发送的消息
void CustomCefView::onInvokeMethodNotify(int browserId, int frameId, const QString& method, const QVariantList& arguments)
{
/** 注意:JS端通过调用 invokeMethod 方法,实际上会有两个参数变量传递过来,
** 一个是 const QString& method, 通过method我们可以进行消息过滤,在Qt中进行消息分发处理
** 另一个是const QVariantList& arguments,通过变量类型我们可知,这个参数同时可以传递多种
** 不同类型的数据到Qt中来,我们可以通过解析消息体,做具体的业务处理。
**/
qDebug() << “[browserId]:” << browserId << " [frameId]:" << frameId << " [method]:" << method << “[arguments]:” << arguments;

if (0 == method.compare(“onDragAreaMouseDown”)) { // for test
HWND hWnd = ::GetAncestor((HWND)getCefWinId(), GA_ROOT);

// get current mouse cursor position
POINT pt;
::GetCursorPos(&pt);// in case the mouse is being captured, try to release it
::ReleaseCapture();// simulate that the mouse left button is down on the title area
::SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, POINTTOPOINTS(pt));
return;

}
else if (0 == method.compare(“configurationTool”)) { // 调用通讯配置工具
configuration.show();
}
else if (0 == method.compare(“openLuaEditor”)) { // 打开lua脚本编辑器
QString Luaparam(arguments.last().value());
msgHandle.luaScriptEditHandle(Luaparam);

}
else {
QString title(“QCef InvokeMethod Notify”);
QString text = QString(“Current Thread: QT_UI\r\n”
“Method: %1\r\n”
“Arguments: …”)
.arg(method);
QMessageBox::information(this->window(), title, text);
}
}

void CustomCefView::onLoadingStateChanged(bool isLoading, bool canGoBack, bool canGoForward)
{
qDebug() << “isLoading:” << isLoading << “canGoBack” << canGoBack << “canGoForward” << canGoForward;
}

void CustomCefView::onLoadStart()
{
qDebug() << “onLoadStart”;
}

void CustomCefView::onLoadEnd(int httpStatusCode)
{
qDebug() << “onLoadEnd” << httpStatusCode;
}

void CustomCefView::onLoadError(int errorCode, const QString &errorMsg, const QString &failedUrl)
{
qDebug() << “onLoadError” << errorCode << errorMsg << failedUrl;
}
二、QT与JS通讯
1、Qt发送消息给JS部分

void CustomCefView::changeColor()
{
qsrand(::GetTickCount());
QColor color(qrand());

/****************以注册消息事件的方式将消息从Qt发送到JS/
QCefEvent event(“colorChangedEvent”);
event.setStringProperty(“color”, color.name()); // 定义事件属性参数
broadcastEvent(“colorChange”, event); // 广播事件
/****************************************************************/
}
2、Qt接收JS消息部分

void CustomCefView::onInvokeMethodNotify(int browserId, int frameId, const QString& method, const QVariantList& arguments)
{
/** 注意:JS端通过调用 invokeMethod 方法,实际上会有两个参数变量传递过来,
** 一个是 const QString& method, 通过method我们可以进行消息过滤,在Qt中进行消息分发处理
** 另一个是const QVariantList& arguments,通过变量类型我们可知,这个参数同时可以传递多种
** 不同类型的数据到Qt中来,我们可以通过解析消息体,做具体的业务处理。
**/
qDebug() << “[browserId]:” << browserId << " [frameId]:" << frameId << " [method]:" << method << “[arguments]:” << arguments;

if (0 == method.compare(“onDragAreaMouseDown”)) { // for test
HWND hWnd = ::GetAncestor((HWND)getCefWinId(), GA_ROOT);

// get current mouse cursor position
POINT pt;
::GetCursorPos(&pt);// in case the mouse is being captured, try to release it
::ReleaseCapture();// simulate that the mouse left button is down on the title area
::SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, POINTTOPOINTS(pt));
return;

}
else if (0 == method.compare(“configurationTool”)) { // 调用通讯配置工具
configuration.show();
}
else if (0 == method.compare(“openLuaEditor”)) { // 打开lua脚本编辑器
QString Luaparam(arguments.last().value());
msgHandle.luaScriptEditHandle(Luaparam);

}
else {
QString title(“QCef InvokeMethod Notify”);
QString text = QString(“Current Thread: QT_UI\r\n”
“Method: %1\r\n”
“Arguments: …”)
.arg(method);
QMessageBox::information(this->window(), title, text);
}
}
3、html中如何处理Qt与JS通讯部分具体的消息收发的

Web Area





this message will be processed by native code.



百度

Open Popup
{"data" : { "rows" : { "flag_addr_label_id" : "0","font_size" : 11,"id" : 0,"name" : "test","save_bit_address_flag" : 0, "text" :"getHmiModel()","trigger_addr_label_ids" :"","trigger_addr_labels" : "","trigger_type" : 0,"type" : 1,"var_list" : ""}}}"
4、JS接收Qt消息部分

function onLoad() {
if (typeof (QCefClient) == ‘undefined’) {
return;
}

       // 增加颜色改变事件的监听QCefClient.addEventListener("colorChange", onColorChanged);QCefClient.addEventListener("languageChange", onLanguageChanged);}

在onLoad() 方法中实际上是做了一个事件监听的,对应我们在Qt端注册的 ”colorChange“ 和"languageChange",当Qt端调用changeColor ()和languageChange()方法时,会触发对应的事件,JS端捕获该事件并做处理,实际上就是实现了Qt(发)==》JS(收)的一个通讯过程。

5、JS发送消息给Qt:

function onOpenConfigurationTool() {
QCefClient.invokeMethod(“configurationTool”, 1, false, “configurationTool”);
}

从上可以看到,在调用invokeMethod()方法时候,传递了4个参数,分别是:

method : [ string ] “configurationTool”

arguments: [ int ] 1

[ bool ] false

[ string ] “configurationTool”

结合我们在Qt讲到的接收JS消息和对应处理,一目了然了。

相关文章:

QCefView应用和网页的交互

一、demo的主要项目文件 结合QCefView自带的demo代码 main.cpp #include #include <QCefContext.h> #include “MainWindow.h” int main(int argc, char* argv[]) { QApplication a(argc, argv); // build QCefConfig QCefConfig config; config.setUserAgent(“QCef…...

C++,设计模式,【建造者模式】

文章目录 通俗易懂的建造者模式&#xff1a;手把手教你造电脑一、现实中的建造者困境二、建造者模式核心思想三、代码实战&#xff1a;组装电脑1. 产品类 - 电脑2. 抽象建造者 - 装机师傅3. 具体建造者 - 电竞主机版4. 具体建造者 - 办公主机版5. 指挥官 - 装机总控6. 客户端使…...

Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…...

科研 | 光子技术为人工智能注入新动力

译《Nature》25.4.9 发表文章《A photonic processing boost for AI》 ▶ 基于人工智能&#xff08;artificial intelligence, AI&#xff09;的系统正被越来越广泛地应用于从基因数据解码到自动驾驶的各类任务。但随着AI模型的规模和应用的扩大&#xff0c;性能天花板与能耗壁…...

SQL语句练习 自学SQL网 多表查询

目录 Day 6 用JOINs进行多表联合查询 Day 7 外连接 OUTER JOINs Day 8 外连接 特殊关键字 NULLs Day 6 用JOINs进行多表联合查询 SELECT * FROM Boxoffice INNER JOIN movies ON movies.idboxoffice.Movie_id;SELECT * FROM Boxoffice INNER JOIN moviesON movies.idboxoffi…...

北京亦庄机器人马拉松:人机共跑背后的技术突破与产业启示

2025年4月19日&#xff0c;北京亦庄举办了一场具有里程碑意义的科技赛事——全球首个人形机器人半程马拉松。这场人类与20支机器人战队共同参与的21.0975公里竞速&#xff0c;不仅创造了人形机器人连续运动的最长纪录&#xff0c;更成为中国智能制造领域的综合性技术验证平台。…...

大连理工大学选修课——机器学习笔记(6):决策树

决策树 决策树概述 决策树——非参数机器学习方法 参数方法&#xff1a; 参数估计是定义在整个空间的模型 所有训练数据参与估算 所有的检验输入都用相同的模型和参数 非参数方法&#xff1a; 非参数估计采用局部模型 输入空间被分裂为一系列可以用距离度量的局部空间…...

现代前端工具链深度解析:从包管理到构建工具的完整指南

前言 在当今快速发展的前端生态中&#xff0c;高效的工具链已经成为开发者的必备利器。一个优秀的前端工具链可以显著提升开发效率、优化项目性能并改善团队协作体验。本文将深入探讨现代前端开发中最核心的两大工具类别&#xff1a;包管理工具(npm/yarn)和构建工具(Webpack/V…...

[C语言]猜数字游戏

文章目录 一、游戏思路揭秘二、随机数生成大法1、初探随机数&#xff1a;rand函数的魔力2、随机数种子&#xff1a;时间的魔法3、抓住时间的精髓&#xff1a;time函数 三、完善程序四、游戏成果1、游戏效果2、源代码 一、游戏思路揭秘 猜数字游戏&#xff0c;这个听起来就让人…...

【Linux】g++安装教程

Linux上安装g教程 实现c语言在Linux上编译运行 1. 更新软件包列表 打开终端&#xff0c;先更新软件包列表以确保获取最新版本信息&#xff1a; sudo apt update2. 安装 build-essential 工具包 build-essential 包含 g、gcc、make 和其他编译所需的工具&#xff1a; sudo…...

MQTT - Android MQTT 编码实战(MQTT 客户端创建、MQTT 客户端事件、MQTT 客户端连接配置、MQTT 客户端主题)

Android MQTT 编码实战 1、Settting 在项目级 build.gradle 目录下导入 MQTT 客户端依赖 implementation org.eclipse.paho:org.eclipse.paho.mqttv5.client:1.2.5 implementation org.eclipse.paho:org.eclipse.paho.android.service:1.1.1AndroidManifest.xml&#xff0c;…...

Redis分布式锁使用以及对接支付宝,paypal,strip跨境支付

本章重点在于如何使用redis的分布式锁来锁定库存。减少超卖&#xff0c;同时也对接了支付宝&#xff0c;paypal&#xff0c;strip跨境支付 第一步先建立一个商品表 CREATE TABLE sys_product (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(60) DEFAUL…...

沙箱逃逸(Python沙盒逃逸深度解析)

沙箱逃逸&#xff08;Python沙盒逃逸深度解析&#xff09; 一、沙盒逃逸的核心目标 执行系统命令 通过调用os.system、subprocess.Popen等函数执行Shell命令&#xff0c;例如读取文件或反弹Shell。 文件操作 读取敏感文件&#xff08;如/etc/passwd&#xff09;、写入后门文件…...

k8s-Pod生命周期

初始化容器 初始化容器是在pod的主容器启动之前要运行的容器&#xff0c;主要是做一些主容器的前置工作&#xff0c;它具有两大特征&#xff1a; 1. 初始化容器必须运行完成直至结束&#xff0c;若某初始化容器运行失败&#xff0c;那么kubernetes需要重启它直到成功完成 2. 初…...

基于Springboot + vue实现的中医院问诊系统

项目描述 本系统包含管理员、医生、用户三个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。 权限管理&#xff1a;分配和管理…...

computed计算值为什么还可以依赖另外一个computed计算值?

在 Vue&#xff08;或类似的响应式框架&#xff09;中&#xff0c;computed 计算属性之所以可以依赖另一个 computed 属性&#xff0c;是因为&#xff1a; ✅ 本质上 computed 是响应式依赖的“派生值” 每个 computed 本质上就是一个 基于其他响应式数据计算出来的值。 当你在…...

近期实践总结

一、计算机二级考试到底教会了我们什么&#xff1f; 1、概况 根据本人复习、考试的经验&#xff0c;不难发现里面的试题或多或少有些死板&#xff08;甚至可以说落后于时代&#xff09;&#xff0c;当今时代已经不是二十年前什么都需要手搓的时代了&#xff0c;引擎、集成类软…...

Arduion 第一天,变量的详细解析

Arduino变量详解与嵌入式开发扩展 一、变量基础篇 1.1 变量声明与初始化 <ARDUINO>int ledPin 13; // 声明并初始化float sensorValue; // 先声明后赋值unsigned long startTime; // 无符号长整型void setup() {sensorValue analogRead(A0) *…...

【每日八股】复习 MySQL Day3:锁

文章目录 昨日内容复习MySQL 使用 B 树作为索引的优势是什么&#xff1f;索引有哪几种&#xff1f;什么是最左匹配原则&#xff1f;索引区分度&#xff1f;联合索引如何排序&#xff1f;使用索引有哪些缺陷&#xff1f;什么时候需要建立索引&#xff0c;什么时候不需要&#xf…...

2025年KBS新算法 SCI1区TOP:长颖燕麦优化算法AOO,深度解析+性能实测

目录 1.摘要2.算法原理3.结果展示4.参考文献5.文章&代码获取 1.摘要 本文提出了一种新颖的元启发式算法——长颖燕麦优化算法&#xff08;AOO&#xff09;&#xff0c;该算法灵感来自动画燕麦在环境中的自然行为。AOO模拟了长颖燕麦的三种独特行为&#xff1a;(i) 通过自然…...

1.4 点云数据获取方式——结构光相机

图1-4-1结构光相机 结构光相机作为获取三维点云数据的关键设备,其工作原理基于主动式测量技术。通过投射已知图案,如条纹、点阵、格雷码等,至物体表面,这些图案会因物体表面的高度变化而发生变形。与此同时,利用相机从特定...

2025.4.29总结

工作&#xff1a;最近手头活变得多起来了&#xff0c;毕竟要测两个版本&#xff0c;有时候觉得很奇怪&#xff0c;活少的时候&#xff0c;又想让别人多分点活&#xff0c;活多的时候&#xff0c;又会有些许不自然。这种反差往往伴随着项目的节奏&#xff0c;伴随着两个极端。所…...

初探RAG

源码 核心工作流程 读取文件的内容将内容保存在向量数据库检索向量数据库用户的问题用户问题 上下文【向量数据】 > LLM 读取文件内容【pdf为例】 from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainerclass PDFFileLoader():d…...

AIGC(生成式AI)技术全景图:从文本到图像的革命

AIGC&#xff08;生成式AI&#xff09;技术全景图&#xff1a;从文本到图像的革命 前言 生成式人工智能&#xff08;AIGC&#xff09;正以惊人的速度重塑数字内容的生产方式。从GPT系列模型的文本生成&#xff0c;到Stable Diffusion的图像创作&#xff0c;再到Sora的视频合成…...

通信协议:数字世界的隐形语言——从基础认知到工程实践-优雅草卓伊凡

通信协议&#xff1a;数字世界的隐形语言——从基础认知到工程实践-优雅草卓伊凡 一、理解通信协议&#xff1a;数字世界的”隐形语法” 1.1 通信协议的不可见性与现实存在 通信协议如同空气中的无线电波&#xff0c;虽然看不见摸不着&#xff0c;却实实在在支撑着现代数字世…...

RPC复习

RPC复习 RPC (远程过程调用) 全面解析一、RPC 定义与核心作用1. 什么是RPC&#xff1f;2. 核心作用 二、主流RPC框架对比三、RPC适用场景四、RPC的缺陷五、RPC vs REST vs GraphQL六、Java实现案例&#xff1a;使用Dubbo框架案例描述1. 环境准备2. 定义服务接口3. 服务提供方实…...

Express 文件上传不迷路:req.files 一次性讲明白

前言 在开发后台接口的江湖中,文件上传堪称“隐藏副本”,难度不大但坑点极多。本来只想优雅接收一张图片,结果 undefined、报错、路径错乱轮番登场,逼得人想重拾卖烤红薯的梦想。别慌,本文将用轻松幽默的方式,深入拆解 req.files.file 的每个属性,从前端表单到后台处理…...

Leetcode 3530. Maximum Profit from Valid Topological Order in DAG

Leetcode 3530. Maximum Profit from Valid Topological Order in DAG 1. 解题思路2. 代码实现 题目链接&#xff1a;3530. Maximum Profit from Valid Topological Order in DAG 1. 解题思路 这一题的整体思路就是一个动态规划的思路&#xff0c;我们只需要在当前可以访问的…...

Mysql中索引的知识

Mysql中的索引的定义和种类 核心概念&#xff1a;索引是什么&#xff1f; 想象一下你有一本很厚的书&#xff0c;你想找到其中关于某个特定主题的内容。你有两种方法&#xff1a; 从头到尾翻阅整本书&#xff1a;这就像数据库中的全表扫描 (Full Table Scan)。如果书很长&…...

VSCode Verilog编辑仿真环境搭建

VSCode Verilog环境搭建 下载Iverilog安装Iverilog验证安装VS Code安装插件 下载Iverilog 官网下载Iverilog 安装Iverilog 一定要勾选这两项 建议勾选这两项 验证安装 运行Windows PowerShell输入命令&#xff1a;iverilog输入命令&#xff1a;Get-Command gtkwave …...

linux修改环境变量

添加环境变量注意事项。 vim ~/.bashrc 添加环境变量时&#xff0c;需要source ~/.bashrc后才能有效。同时只对当前shell窗口有效&#xff0c;当打开另外的shell窗口时&#xff0c;需要重新source才能起效。 1.修改bashrc文件后 2.source后打开另一个shell窗口则无效&#xff…...

为什么要学习《金刚经》

《金刚经》作为佛教般若经典的核心&#xff0c;以"缘起性空"为思想根基&#xff0c;通过佛陀与须菩提的对话&#xff0c;揭示了破除执著、见真实相的智慧。 以下从核心要义、精髓段落和现实应用三个维度进行解读&#xff1a; 一、核心思想精髓 1. "凡所有相&am…...

【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (上篇)(⭐️⭐️⭐️ 重点章节!!!)

习题集: 【单选题】在大模型微调中,与提示工程和RAG相比,微调的独特优势在于( ) A. 无需外部工具即可提升模型表现 B. 能让模型学习特定领域知识,提升底层能力 C. 可以更高效地检索知识 D. 能直接提升模型的知识边界,无需训练 【多选题】以下关于机器学习和传统编程的说…...

Docker 容器双网卡访问物理雷达网络教程

作者&#xff1a; 陈梓洋 环境&#xff1a; ubuntu 22.04lts 时间&#xff1a; 2025年4月29日 Docker 容器双网卡访问物理雷达网络教程 这个教程适用于这样的场景&#xff1a;容器保留原有 ROS 通信网络&#xff08;如 bridge 网络&#xff09;&#xff0c;同时需要访问一个物…...

C++:Lambda表达式

C&#xff1a;Lambda表达式 C中lambda的基本语法1. 捕获列表&#xff08;Capture List&#xff09;2. 示例代码示例 1&#xff1a;简单的lambda示例 2&#xff1a;捕获变量示例 3&#xff1a;按引用捕获示例 4&#xff1a;捕获所有变量示例 5&#xff1a;作为函数参数 3. lambd…...

Vim 中替换字符或文本

在 Vim 中替换字符或文本可以使用 替换命令&#xff08;substitute&#xff09;&#xff0c;其基本语法为&#xff1a; :[range]s/old/new/[flags]1. 基本替换 命令说明:s/foo/bar/替换当前行的第一个 foo 为 bar:s/foo/bar/g替换当前行的 所有 foo 为 bar:%s/foo/bar/g替换 …...

Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站

主要功能介绍 1.PHP MYSQL开发,开源,方便二次开发。 2.后台管理界面清新 3.可批量导入导出数据,格式为:JsoN、CSV、 Excel等。 4.自适应手机端,PC端 5.数据修改,添加,删除非常方便,手机上就可以解决 6.可以增加管理员权限等 7.界面可以个性定制开发...

OpenAI Embedding 和密集检索(如 BERT/DPR)进行语义相似度搜索有什么区别和联系

OpenAI Embedding 和密集检索&#xff08;如 BERT/DPR&#xff09;其实是“同一种思想的不同实现”&#xff0c;它们都属于Dense Retrieval&#xff08;密集向量检索&#xff09;&#xff0c;只不过使用的模型、部署方式和调用方式不同。 &#x1f9e0; 首先搞清楚&#xff1a;…...

C语言复习笔记--数据在内存中的存储

今天我们来复习一下数据在内存中的存储方式.话不多说进入正题. 整数在内存中的存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码.三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤1表⽰“负”&#xff0c;⽽数值位最⾼位…...

笔试专题(十二)

文章目录 主持人调度题解代码 小红的ABC题解代码 不相邻取数题解代码 空调遥控题解代码 主持人调度 题目链接 题解 1. 排序 2. 先按左端点的大小进行排序&#xff0c;保证时间是连续的&#xff0c;如果后一个点的左端点大于等于前一个点的右端点就是和法的&#xff0c;否则…...

Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用---后台调用Python Matplotlib绘制图形

Rust语言最接近Python Matplotlib绘图库的应该是Plotters&#xff0c;但是试用下来还是没有Matplotlib效果好&#xff0c;所以尝试在Tauri Leptos项目中&#xff0c;后台调用Python Matplotlib绘制图形&#xff0c;并返回给前端Leptos展示。 具体效果如下&#xff1a; 1. 前端…...

Qemu-STM32(十七):STM32F103加入AFIO控制器

概述 本文主要描述了在Qemu平台中&#xff0c;如何添加STM32F103的AFIO控制器模拟代码&#xff0c;AFIO是属于GPIO引脚复用配置的功能。 参考资料 STM32F1XX TRM手册&#xff0c;手册编号&#xff1a;RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…...

刀客doc:小红书商业技术负责人苍响离职

根据大厂日爆的爆料&#xff0c;小红书商业化再度迎来高层人事变动&#xff0c;原商业平台技术负责人苍响&#xff08;薯名&#xff09;&#xff0c;职级L2&#xff0c;已于本月正式离职&#xff0c;其下属团队现由电商业务负责人接管。 根据刀客doc获得的资料&#xff0c;苍响…...

CC52.【C++ Cont】滑动窗口

目录 1.题目 2.分析 方法1:暴力枚举 方法2:暴力枚举的优化:"同向双指针",也称滑动窗口 前置知识 核心操作 例子解释 代码 提交结果 1.题目 LCR 008. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target…...

linux中由于编译选项-D_OS64BIT导致的核心已转储问题

linux中由于编译选项-D_OS64BIT导致的核心已转储问题排查解决&#xff1a; 原因&#xff1a; a.so b.so a.so使用b.so 程序1 程序2 使用a.so 程序1运行正常&#xff0c;程序2启动后提示核心已转储。 程序1和程序2运行的代码都一致&#xff0c;只执行创建xApplication app&…...

Ubuntu搭建 Nginx以及Keepalived 实现 主备

目录 前言1. 基本知识2. Keepalived3. 脚本配置4. Nginx前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRU…...

Knife4j 接口文档添加登录验证流程分析

Knife4j 接口文档添加登录验证流程是非常必要的&#xff0c;否则接口文档一旦暴露到外面是很危险的&#xff0c;今天我们详细分析一下。在1.9.6的版本时&#xff0c;作者把swagger-bootstrap-ui项目重命名为Knife4j&#xff0c;今天分析2.0.6版本。 1、pom.xml文件引入 <pa…...

C++之string

string 是C中常见的一个用于处理和操作字符串的类。一直有用它来存储字符串&#xff0c;今天来介绍介绍一下它的定义和一些基本用法吧。 1、头文件 #include <string>2、定义和初始化 #include <iostream> #include <string> using namespace std;int main…...

【含文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现

项目介绍 本课程演示的是一款基于SSM的电影数据挖掘与分析可视化系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...

DeepSeek提示词技巧

以下是使用Deepseek等AI工具时提升效果的提示词模式总结&#xff0c;涵盖核心规律、应用场景及效果对比&#xff1a; 规律一&#xff1a;结构化提示&#xff08;解决模糊性问题&#xff09; 问题&#xff1a;开放式问题导致回答笼统 模式&#xff1a;角色任务约束输出格式 例子…...