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

Qt——xml文件生成DBus接口

1. 如何根据xml文件生成Dbus接口

         要使用 XML 文件生成 D-Bus 接口,你可以按照以下步骤操作:

        步骤 1: 准备 XML 文件

                确保你的 XML 文件遵循 D-Bus 的接口描述规范。这通常包括定义接口、方法、信号和属性。一个基本的例子如下:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN""http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node><interface name="com.example.SampleInterface"><method name="TestMethod"><arg direction="in" type="s" name="input"/><arg direction="out" type="s" name="output"/></method><signal name="TestSignal"><arg type="s" name="signalData"/></signal></interface>
</node>

        步骤 2: 使用工具生成代码

                在 Linux 系统上,你可以使用 `gdbus-codegen` 工具来根据 XML 文件生成代码。这个工具是 Glib 库的一部分,能够生成服务端和客户端代码。

1. 安装工具(如果尚未安装):sudo apt-get install libglib2.0-dev2. 生成代码:gdbus-codegen --generate-c-code my_interface_gen --c-namespace My --interface-prefix com.example. my_interface.xml
这里,`my_interface_gen` 是生成的源文件的前缀,`com.example.` 是接口名称的前缀,`my_interface.xml` 是你的 XML 文件。生成的文件通常包括:
- `my_interface_gen.h`:头文件,包含接口定义。
- `my_interface_gen.c`:源文件,包含接口实现的框架。

        当你使用工具如 `qdbusxml2cpp`(这是 Qt 提供的一个工具,用来从 D-Bus XML 描述文件生成 D-Bus 适配器代码),你会得到两个主要的文件:

        1. Header (.h) 文件 - 包含了从 XML 文件定义的 D-Bus 接口生成的 C++ 类的声明。这个类通常继承自 `QDBusAbstractAdaptor`。
        2. Source (.cpp) 文件 - 包含了实现文件,实现了 XML 文件中定义的接口。

        使用 `qdbusxml2cpp` 生成的适配器代码可能会看起来像这样:

// Generated Adaptor Code (SampleAdaptor.h)
#include <QDBusAbstractAdaptor>
#include <QDBusConnection>
#include <QObject>class SampleAdaptor : public QDBusAbstractAdaptor {Q_OBJECTQ_CLASSINFO("D-Bus Interface", "com.example.SampleInterface")
public:SampleAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) {// Constructor code here}public slots:QString TestMethod(const QString &input) {// Implementation herereturn "Received: " + input;}
signals:void TestSignal(const QString &signalData);
};

2. QDBusAbstractAdaptor QDBusAbstractInter区别是什么?

        在 Qt 的 D-Bus 模块中,`QDBusAbstractAdaptor` 和 `QDBusAbstractInterface` 是两个核心类,它们在 D-Bus 系统中扮演不同的角色,分别用于实现服务端适配器和客户端接口。下面是这两个类的主要区别和用途:

QDBusAbstractAdaptor

1. 定义与用途:
   - `QDBusAbstractAdaptor` 类用于创建 D-Bus 适配器。这个适配器充当了 Qt 对象和 D-Bus 之间的桥梁。
   - 它通常用于将现有的 Qt 对象的功能公开为 D-Bus 服务,允许其他应用程序通过 D-Bus 调用这些功能。

2. 工作方式:
   - 适配器类从 `QDBusAbstractAdaptor` 派生,并将其关联到一个 QObject。这个适配器为 QObject 定义的公开方法、信号和属性提供 D-Bus 访问。

3. 特点:
   - 适配器通过注册到 D-Bus 系统来使得其他应用可以通过 D-Bus 通信机制调用其方法、接收信号或访问属性。

QDBusAbstractInterface

1. 定义与用途:
   - `QDBusAbstractInterface` 类用于创建能与 D-Bus 服务进行交互的客户端接口。
   - 它通常用于编写客户端应用程序,这些应用程序需要与 D-Bus 服务通信,调用服务提供的方法或访问服务的属性。

2. 工作方式:
   - 从 `QDBusAbstractInterface` 派生的类可以用来表示 D-Bus 上的远程接口。这个类处理所有的低级 D-Bus 通信细节,如方法调用、信号订阅和属性访问。

3. 特点:
   - 客户端接口对象提供了一个高级的抽象,使得开发者可以像调用本地对象一样调用远程 D-Bus 服务的方法。

        `QDBusAbstractAdaptor` 适用于需要将应用的一部分功能通过 D-Bus 公开给其他应用调用的场景(服务端),`QDBusAbstractAdaptor` 是为了将本地对象的功能“导出”到 D-Bus 上。

         `QDBusAbstractInterface` 适用于需要从应用中访问其他应用公开的 D-Bus 服务的场景(客户端),`QDBusAbstractInterface` 是为了从 D-Bus 上“导入”远程服务的接口。

        2.1 举例

                接下来通过一个简单的例子来展示如何使用 `QDBusAbstractAdaptor` 和 `QDBusAbstractInterface` 来在 Qt 应用程序中实现 D-Bus 服务端和客户端。

                假设我们有一个简单的系统服务,它提供了一个方法来获取系统的当前时间。我们将首先创建一个服务端应用程序,它使用 `QDBusAbstractAdaptor` 将这个功能公开为一个 D-Bus 服务。然后,我们将创建一个客户端应用程序,使用 `QDBusAbstractInterface` 来访问这个服务

服务端:使用 QDBusAbstractAdaptor

1. 定义服务接口 (`TimeService.h`):#include <QObject>#include <QDBusAbstractAdaptor>#include <QDateTime>class TimeService : public QObject{Q_OBJECTQ_CLASSINFO("D-Bus Interface", "com.example.timeservice")public:explicit TimeService(QObject *parent = nullptr) : QObject(parent) {}public slots:QString getCurrentTime() {return QDateTime::currentDateTime().toString();}};class TimeServiceAdaptor : public QDBusAbstractAdaptor{Q_OBJECTQ_CLASSINFO("D-Bus Interface", "com.example.timeservice")public:explicit TimeServiceAdaptor(TimeService *service): QDBusAbstractAdaptor(service), m_service(service) {setAutoRelaySignals(true);}public slots:QString getCurrentTime() {return m_service->getCurrentTime();}private:TimeService *m_service;};2. 实现主函数 (`main.cpp`):#include <QCoreApplication>#include <QDBusConnection>#include "TimeService.h"int main(int argc, char *argv[]){QCoreApplication app(argc, argv);TimeService service;TimeServiceAdaptor adaptor(&service);QDBusConnection connection = QDBusConnection::sessionBus();connection.registerObject("/timeservice", &service);connection.registerService("com.example.timeservice");return app.exec();}

        仔细看代码会发现 `TimeServiceAdaptor`构造函数中,有一个方法`setAutoRelaySignals(true)`,这个函数的作用可参见setAutoRelaySignals(true)-CSDN博客

客户端:使用 QDBusAbstractInterface

1. 定义客户端接口 (`TimeClient.h`):#include <QDBusAbstractInterface>#include <QDBusConnection>class TimeClient : public QDBusAbstractInterface{Q_OBJECTpublic:explicit TimeClient(QObject *parent = nullptr): QDBusAbstractInterface("com.example.timeservice","/timeservice","com.example.timeservice",QDBusConnection::sessionBus(),parent) {}QDBusPendingCall asyncGetCurrentTime() {return asyncCall("getCurrentTime");}};2. 实现客户端主函数 (`main.cpp`):#include <QCoreApplication>#include <QDebug>#include "TimeClient.h"int main(int argc, char *argv[]){QCoreApplication app(argc, argv);TimeClient client;QDBusPendingReply<QString> reply = client.asyncGetCurrentTime();reply.waitForFinished();if (reply.isValid()) {qDebug() << "Current Time:" << reply.value();} else {qDebug() << "Error:" << reply.error().message();}return app.exec();}

        在这个示例中:
        - 服务端应用程序创建了一个 `TimeService` 对象和一个 `TimeServiceAdaptor` 适配器,通过 D-Bus 在 `com.example.timeservice` 服务下公开了一个方法 `getCurrentTime`。
        - 客户端应用程序使用 `TimeClient`(派生自 `QDBusAbstractInterface`)来异步调用这个方法,并在接收到结果后打印当前时间或错误信息。

3. xml生成的QDBusAbstractAdaptor函数 直接就生成dbus服务了吗?

        使用 XML 文件生成 `QDBusAbstractAdaptor` 类的代码并不会直接创建一个运行的 D-Bus 服务。这个过程只是自动化了在 Qt 中为 D-Bus 服务编写适配器代码的部分工作,生成的适配器代码需要在一个 Qt 应用程序中被编译和运行,才能实际形成一个可用的 D-Bus 服务。

        看过刚刚服务端的例子,可以了解到尽管 XML 到 `QDBusAbstractAdaptor` 的代码生成是自动的,但是要让这个适配器成为一个活跃的 D-Bus 服务,还需要手动编写一些胶水代码来实例化和注册到 D-Bus 系统。这包括设置 Qt 应用程序基础设施、实例化适配器类、并且确保它被注册为一个 D-Bus 服务。

4. QDBusAbstractAdaptor如何绑定的接口

        在 Qt 的 D-Bus 系统中,`QDBusAbstractAdaptor` 类用于将一个 QObject 或其子类的方法、属性和信号绑定到 D-Bus 接口。这个绑定过程是通过几个关键步骤实现的,使得当远程 D-Bus 调用发生时,相应的本地 QObject 的方法能够被触发。下面详细介绍这个过程。

创建 QObject 子类

        首先,你需要有一个 QObject 子类,这个类实现了你想要通过 D-Bus 公开的功能。例如:

class MyService : public QObject {Q_OBJECT
public:explicit MyService(QObject *parent = nullptr) : QObject(parent) {}public slots:QString performAction(const QString &param) {// 实现具体的功能return "Action performed with: " + param;}
};

创建和配置 QDBusAbstractAdaptor 子类

        接着,你创建一个从 `QDBusAbstractAdaptor` 派生的类,这个类将作为中间人,把 D-Bus 调用转发到你的 QObject 子类。你需要在这个适配器类中声明你想通过 D-Bus 公开的所有方法、信号和属性。

class MyServiceAdaptor : public QDBusAbstractAdaptor {Q_OBJECTQ_CLASSINFO("D-Bus Interface", "com.example.MyService")
public:explicit MyServiceAdaptor(MyService *service): QDBusAbstractAdaptor(service), myService(service) {// 自动将所有信号关联到 D-BussetAutoRelaySignals(true);}public slots:QString performAction(const QString &param) {return myService->performAction(param);}private:MyService *myService;
};

注册 QObject 和适配器到 D-Bus 系统

        在你的应用程序的主函数中或在适当的初始化代码中,你需要创建你的服务和适配器的实例,并将它们注册到 D-Bus 系统中。

int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);MyService service;MyServiceAdaptor adaptor(&service);QDBusConnection dbus = QDBusConnection::sessionBus();bool success = dbus.registerObject("/MyService", &service);success &= dbus.registerService("com.example.MyService");return success ? app.exec() : -1;
}

绑定和调用流程

1. D-Bus 请求到达:当其他应用通过 D-Bus 发送请求调用 `performAction` 方法时,请求首先到达 D-Bus 守护进程。
2. 适配器接收请求:D-Bus 守护进程将调用转发到注册的对象(在本例中是 `/MyService`)和其适配器。
3. 适配器调用 QObject 方法:`MyServiceAdaptor` 的 `performAction` 方法被触发,该方法内部再调用 `MyService` 实例的 `performAction` 方法。
4. 结果返回给调用者:方法执行完成后的返回值被发送回调用者。

        这种方式通过 `QDBusAbstractAdaptor` 类来封装 QObject 的实现细节,使得 D-Bus 服务的创建和管理更加模块化和清晰。这样,你就能够在 Qt 应用程序中方便地实现和使用基于 D-Bus 的 IPC (进程间通信) 功能。

5. 为了调用能联通 MyServiceAdaptor 和MyService的方法名需一致吗?

        在使用 `QDBusAbstractAdaptor` 时,确保 D-Bus 接口能够正确地调用到后端 `MyService` 的方法,并不严格要求适配器和服务中的方法名完全一致。但是,使它们一致通常会使代码更易于理解和维护。关键在于适配器方法中如何调用服务方法,以及如何映射 D-Bus 接口到具体的实现。
        `QDBusAbstractAdaptor` 的工作是为一个或多个 QObject 方法提供 D-Bus 访问。当你创建适配器类的时候,你定义了哪些方法应该通过 D-Bus 被暴露出去。这包括在适配器中定义方法,这些方法将会在 D-Bus 调用时被触发。在这些方法内部,你可以调用实际的服务对象(例如 `MyService` 类)的任何方法。
        以下示例展示了即使方法名不一致,适配器如何将调用正确地转发给服务对象:

        服务器的类如上,就不举例了,下面是修改后的适配器类
 

 class MyServiceAdaptor : public QDBusAbstractAdaptor {Q_OBJECTQ_CLASSINFO("D-Bus Interface", "com.example.MyService")public:explicit MyServiceAdaptor(MyService *service): QDBusAbstractAdaptor(service), myService(service) {setAutoRelaySignals(true);}public slots:QString performAction(const QString &param) {return myService->serviceAction(param);//注意这里函数名不一致,主要还是看绑定的对象}private:MyService *myService;};

        在这个例子中,适配器的 `performAction` 方法调用了服务对象 `MyService` 的 `serviceAction` 方法。这样的设计允许你在 D-Bus 接口中公开一个逻辑上的接口,而无需关心服务实现的内部方法名,增加了灵活性。

6. xml 生成的`QDBusAbstractInterface`,客户端是怎么使用的?

        在 Qt 中使用 `QDBusAbstractInterface` 创建 D-Bus 客户端是与 D-Bus 服务进行交互的一种方式。`QDBusAbstractInterface` 提供了一个便捷的方法来调用 D-Bus 服务上的方法、订阅信号和访问属性,而无需手写大量的 D-Bus 通信代码。下面详细介绍如何使用 `QDBusAbstractInterface` 创建和使用一个 D-Bus 客户端。

### 步骤 1: 创建客户端接口

假设你已经有一个 D-Bus 服务在运行,比如前面服务端的例子,你可以手动定义接口或使用 `qdbusxml2cpp` 工具生成接口类。这里我们手动定义一个:

   #include <QDBusAbstractInterface>#include <QDBusReply>class TestClient : public QDBusAbstractInterface {public:TestClient (QObject *parent = nullptr): QDBusAbstractInterface("com.test","/test,"com.test",QDBusConnection::sessionBus(),parent) {}QDBusReply<void> test(const QString &name, const QString &testname) {return call("test", name, testname);}};

        这个类定义了如何连接到 D-Bus 服务 (`com.test`) 和调用 `test` 方法。

        使用客户端接口,在你的 Qt 应用程序中,你可以创建 `TestClient` 的实例并使用它来调用 D-Bus 服务。

#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);TestClient client;QDBusReply<void> reply = client.test("test", "test");if (reply.isValid()) {qDebug() << "Call succeeded";} else {qDebug() << "Call failed:" << reply.error().message();}return app.exec();
}

7. QDBusAbstractAdaptor 和QDBusAbstractInterface之间是怎么绑定的呢?

        在 Qt 的 D-Bus 系统中,`QDBusAbstractInterface` 和对应的 `QDBusAbstractAdaptor` 之间的“绑定”是通过 D-Bus 服务的接口定义实现的。具体来说,这种绑定不是在代码层面上直接操作的,而是通过 D-Bus 的服务注册和接口调用机制来实现相互操作的。下面详细解释这个过程。

        这种“绑定”实际上是通过 D-Bus 的消息传递系统在服务端和客户端之间进行的。下面是绑定过程的简化描述:

1. 服务注册:
   - 在服务端,`QDBusAbstractAdaptor` 将 QObject 的某些功能注册为 D-Bus 服务。
   - 服务通过在 D-Bus 系统中注册一个唯一的服务名称和对象路径来完成。
   - 这些信息(服务名称、对象路径、接口名)都需要在客户端知晓,以便能正确地定位和调用服务。

2. 服务发现:
   - 客户端使用 `QDBusAbstractInterface` 来创建一个代表远程服务的对象。
   - 客户端在创建这个接口对象时,需要指定服务名称、对象路径和接口名称。
   - 一旦指定,`QDBusAbstractInterface` 就可以使用这些信息通过 D-Bus 发送调用请求。

3. 方法调用和响应
   - 当客户端通过 `QDBusAbstractInterface` 调用一个方法时,D-Bus 守护进程将这个调用转发到服务端。
   - 服务端的 `QDBusAbstractAdaptor` 接收到调用后,会将其转化为本地的 QObject 方法调用。
   - 执行结果(如果方法调用有返回值)或状态(成功或失败)将通过 D-Bus 返回给客户端。

相关文章:

Qt——xml文件生成DBus接口

1. 如何根据xml文件生成Dbus接口 要使用 XML 文件生成 D-Bus 接口&#xff0c;你可以按照以下步骤操作&#xff1a; 步骤 1: 准备 XML 文件 确保你的 XML 文件遵循 D-Bus 的接口描述规范。这通常包括定义接口、方法、信号和属性。一个基本的例子如下&#xff1a; <!DOCTYPE…...

初识SpringMVC(SpringMVC学习笔记一)

1 、还是熟悉的配方&#xff0c;先创建一个父Maven项目&#xff08;忘记怎么创建项目了就去前面翻笔记&#xff09;&#xff0c;导入通用的配置依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...

FreeRTOS任务管理

1. 任务状态理论讲解 定时器职中断周期此处的1000Hz表示的是没次间隔1毫秒就记一次数&#xff08;在FreeConfig.h&#xff09;文件中进行配置 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 判断是否需要任务切换在FreeRTOS里面每次间隔1毫秒切换一次&#xff08;程序…...

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…...

购物车实现

目录 1.购物车常见的实现方式 2.购物车数据结构介绍 3.实例分析 1.controller层 2.service层 1.购物车常见的实现方式 方式一&#xff1a;存储到数据库 性能存在瓶颈方式二&#xff1a;前端本地存储 localstorage在浏览器中存储 key/value 对&#xff0c;没有过期时间。s…...

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…...

工业数学模型——高炉煤气发生量预测(三)

1、工业场景 冶金过程中生产的各种煤气&#xff0c;例如高炉煤气、焦炉煤气、转炉煤气等。作为重要的副产品和二次能源&#xff0c;保证它们的梯级利用和减少放散是煤气能源平衡调控的一项紧迫任务&#xff0c;准确的预测煤气的发生量是实现煤气系统在线最优调控的前提。 2、…...

pnpm - Failed to resolve loader: cache-loader. You may need to install it.

起因 工作原因需要研究 vue-grid-layout 的源码&#xff0c;于是下载到本地。因为我习惯使用 pnpm&#xff0c;所以直接用 pnpm i 安装依赖&#xff0c;npm run serve 启动失败。折腾了一番没成功。 看到源码里有 yarn.lock&#xff0c;于是重新用 yarn install 安装依赖&…...

CSS transition和animation的用法和区别

Transition和Animation在CSS中都是用于实现元素状态变化的效果&#xff0c;但它们在用法和特性上存在明显的区别。 Transition transition是过度属性&#xff0c;主要强调的是元素状态的过渡效果。 它通常用于在元素的状态发生变化时&#xff0c;平滑地过渡到一个新的状态。…...

书籍推荐(附上每本书的看点)

1、《FPGA深度解析》&#xff0c;这本书的FIFO部分我觉得讲得很好; 2、《verilog数字系统设计教程》&#xff0c;夏宇闻老师的蓝皮书&#xff0c;这本书里包含很多考试知识点; 3、《SOC设计方法和实现》郭炜老师写的&#xff0c;我觉得他的低功耗设计讲得很好; 《高级FPGA设计结…...

LLM理解v1

答疑 什么是知识库&#xff1f; LLM&#xff08;Large Language Models&#xff0c;大型语言模型&#xff09;如GPT系列&#xff0c;通常是基于海量的文本数据进行训练的。它们通过分析和理解这些数据来生成回答、撰写文章、解决问题等。当我们提到LLM的“本地知识库”时&…...

ubuntu 22.04 -- cmake安装

安装方式一&#xff1a;源码安装 1、下载安装包 官网下载&#xff1a;下载链接&#xff1a;Download CMake 也可以使用命令行下载 wget https://github.com/Kitware/CMake/releases/download/v3.26.5/cmake-3.26.5.tar.gz2、解压并安装 # 1、解压 tar -zxvf cmake-3.26.5.…...

字符串算法题(第二十四天)

344. 反转字符串 题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1…...

【Linux】应用层协议序列化和反序列化

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;C【智能指针】 前言 在正式代码开始前&#xff0c;会有一些前提知识引入 目录 &#x1f449;&#x1f3fb;序列…...

使用Canal同步MySQL 8到ES中小白配置教程

&#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680; 文章目录 &#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680;**摘要****引言****正文**&#x1f4d8; 第1章&#xff1a;初识Canal1.1 Canal概述1.2 工作原理解析 &#x1f4d8; 第2章&…...

关于部署ELK和EFLK的相关知识

文章目录 一、ELK日志分析系统1、ELK简介1.2 ElasticSearch1.3 Logstash1.4 Kibana&#xff08;展示数据可视化界面&#xff09;1.5 Filebeat 2、使用ELK的原因3、完整日志系统的基本特征4、ELK的工作原理 二、部署ELK日志分析系统1、服务器配置2、关闭防火墙3、ELK ElasticSea…...

实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示

实验室信息系统源码 saas模式java.Net Core版开发的云LIS系统全套源码可二次开发有演示 一、技术框架 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&am…...

PCB---Design Entry cis 绘图 导出

修改纸张大小&#xff1a; 画图前准备&#xff1a;导入 画图&#xff1a; 习惯&#xff1a; 电源朝上 地朝下 配置pbc_footprint编号&#xff1a; 都配置好编号就可以导出了 导出&#xff1a;...

vue 一键更换主题颜色

这里提供简单的实现步骤&#xff0c;具体看自己怎么加到项目中 我展示的是vue2 vue3同理 在 App.vue 添加 入口处直接修改 #app { // 定义的全局修改颜色变量--themeColor:#008cff; } // 组件某些背景颜色需要跟着一起改变&#xff0c;其他也是同理 /deep/ .ant-btn-primar…...

WebKit内核游览器

WebKit内核游览器 基础概念游览器引擎Chromium 浏览器架构Webkit 资源加载这里就不得不提到http超文本传输协议这个概念了&#xff1a; 游览器多线程HTML 解析总结 基础概念 百度百科介绍 WebKit 是一个开源的浏览器引擎&#xff0c;与之相对应的引擎有Gecko&#xff08;Mozil…...

Qt 拖放功能详解:理论与实践并举的深度指南

拖放&#xff08;Drag and Drop&#xff09;作为一种直观且高效的用户交互方式&#xff0c;在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持&#xff0c;允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理&#xff0c;结合详…...

Springboot+Vue项目-基于Java+MySQL的企业客户管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…...

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…...

统一SQL-number/decimal/dec/numeric转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 通过统一SQL&#xff0c;将Oracle中的numb…...

软件测试入门学习笔记

系统测试流程规范 一.研发模型 1.瀑布模型 从可行性研究&#xff08;或系统分析&#xff09;开始&#xff0c;需求 2.增量迭代模型 3.敏捷开发模型 二.质量模型...

31. 下一个排列

题目描述 整数数组的一个排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地&…...

Android笔记: mkdirs不生效失败

Manifest已经配置权限,代码中也动态获取权限,mkdirs一直返回false File.mkdirs()方法创建文件夹失败 1、动态申请读写权限 <!--SDCard写权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--SDCard读权…...

需要添加的硬币的最小数量(Lc2952)——贪心+构造

给你一个下标从 0 开始的整数数组 coins&#xff0c;表示可用的硬币的面值&#xff0c;以及一个整数 target 。 如果存在某个 coins 的子序列总和为 x&#xff0c;那么整数 x 就是一个 可取得的金额 。 返回需要添加到数组中的 任意面值 硬币的 最小数量 &#xff0c;使范围 …...

军工保密资质介绍及申请要求

军工保密资质介绍 军工保密资质是指国家对从事军工研发、生产、销售等活动的企事业单位进行的一种资质认证。该资质的核心目标是保护国家军事机密和军事技术秘密&#xff0c;确保国家安全和国防利益。军工保密资质的认证标准非常严格&#xff0c;涉及企业的安全管理、技术保密…...

ES6的编程风格

ES6 提出了两个新的声明变量的命令&#xff1a;let和const。其中&#xff0c;let完全可以取代var&#xff0c;因为两者语义相同&#xff0c;而且let没有副作用。 var命令存在变量提升效用&#xff0c;let命令没有这个问题 if (true) {console.log(x); // ReferenceErrorlet x…...

springboot 载入自定义的yml文件转DTO

json解析的pom引入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.8.20</version></dependency>resources目录下的my-data.yml project:data:- name: service-genbase-package:…...

webpack-(plugin,本地服务器,路径别名,安装vue)

安装vue npm i vue-loader -D npm i vue 编写一个vue文件&#xff1a; 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊&#xff0c;除了使用loader外&#xff0c;还使用了plugin const path require("path"); const { VueLoaderPlugin …...

http请求头导致了dial tcp:lookup xxxx on 10.43.0.10:53 no sunch host

事实证明人有的时候也不能太偷懒&#xff0c;太偷懒容易给自己埋坑。 问题的背景&#xff1a; web端调用服务A&#xff0c;服务A异步调用服务B。服务A有四个场景需要调用服务B&#xff0c;所以&#xff0c;服务A中封装了一个公用的方法&#xff0c;唯一的区别是&#xff0c;场…...

想要设计放大电路,必须掌握哪些?

放大电路是电子系统中的核心组成部分&#xff0c;其设计好坏将直接影响到整个系统的性能&#xff0c;对电子工程师来说&#xff0c;在设计放大电路时&#xff0c;必须掌握且关注多方面&#xff0c;以此确保电路的稳定性和放大效果&#xff0c;那么需要注意哪些&#xff1f; 1、…...

每天五分钟计算机视觉:基于卷积操作完成滑动窗口的图片分类?

本文重点 我们前面学习了使用不同大小的滑动窗口来滑动图片,然后切分成许多小的图片,然后依次应用到我们已经训练好的图像分类模型中,但是这种方式效率太低了,本节课程我们学习一种新的方式,来看一下如何并行识别这些剪切的图片。 原始结构 首先我们先来看一下,如何把…...

UI设计/交互设计/视觉设计项目汇报/作品集Figma/PPT模板

作为UI设计/交互设计/视觉设计师&#xff0c;创建作品集对于向潜在客户或雇主展示您的技能、创造力和风格至关重要。以下分步指南可帮助您创建令人印象深刻的作品集&#xff1a; 选择您的最佳作品&#xff1a;选择您最强大且最相关的设计项目&#xff0c;将其纳入您的作品集。…...

25、Lua 学习笔记之三(高阶话题)

Lua 学习笔记之三 高阶话题迭代实例代码有关迭代的描述 协作线程实例代码有关协作线程的描述 高阶话题 迭代 实例代码 --迭代 local function enum(array)local index 1return function()local ret array[index]index index 1return retend endlocal function foreach(a…...

企业网盘搭建——LNMP

php包链接&#xff1a;https://pan.baidu.com/s/1RElYTQx320pN6452N_7t1Q?pwdp8gs 提取码&#xff1a;p8gs 网盘源码包链接&#xff1a;https://pan.baidu.com/s/1BaYqwruka1P6h5wBBrLiBw?pwdwrzo 提取码&#xff1a;wrzo 目录 一.手动部署 二.自动部署 一.手动部署 …...

Go语言异常处理方式

Go 语言没有传统的异常处理机制&#xff0c;如 Java、C 或 Python 中的 try-catch 语句。取而代之&#xff0c;Go 采用了基于返回错误值和 panic/recover 机制的混合模式来进行错误处理。以下是 Go 语言中处理异常&#xff08;或称错误&#xff09;的两种主要方式&#xff1a; …...

时序分析基本知识点

【FPGA开发/IC开发之时序约束最全面的归纳总结】时序路径基本概念及时序约束分析方法_时序约束指令-CSDN博客...

ELK(Elasticsearch+Logstash+Kibana)日志分析系统

目录 前言 一、ELK日志分析系统概述 1、三大组件工具介绍 1.1 Elasticsearch 1.1.1 Elasticsearch概念 1.1.2 关系型数据库和ElasticSearch中的对应关系 1.1.3 Elasticsearch提供的操作命令 1.2 Logstash 1.2.1 Logstash概念 1.2.2 Logstash的主要组件 1.2.3 Logsta…...

【投稿优惠-EI稳定检索】2024年地理信息技术与遥感测绘国际学术会议(ICGITRSM 2024)

2024 International Conference on Geographic Information Technology and Remote Sensing Mapping (ICGITRSM 2024) ●会议简介 2024年地理信息技术与遥感测绘国际学术会议将聚焦于地理信息技术及遥感测绘领域的最新发展与应用。本次会议汇聚了来自世界各地的顶尖专家和学者…...

MySQL的内外连接

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容主要介绍了MySQL中的内外连接 文章目录 MySQL的内外连接…...

Pandas连接MySQL数据库

pandas是一个强大的Python工具包&#xff0c;能够快速帮助我们做很多数据处理。但是在利用pandas连接数据库时&#xff0c;也会遇到很多问题&#xff0c;在此我总结了一个相对较为简单的连接范式&#xff0c;供大家参考学习。 先上代码&#xff1a; import pandas as pd# 数据…...

2024华中杯数学建模参考思路+完整代码+后续成品论文预约

&#xff08;完整版资料获取在文末哦&#xff09; 关于24年华中杯的更新进度&#xff0c;大家可以参考我们前年比赛。 22年华中杯思路&#xff1a; 大家也可以看这一篇 A题思路 一订单包含多种货品&#xff0c;每种商品有不同的数量&#xff0c;题目没说订单的需求时间&am…...

ARM_day8:基于iic总线的通信

一、IIC总线的基本概念&#xff1a; iic总线是一种带应答的同步的、串行、半双工的通信方式&#xff0c;支持一个主机对应多个从机。它有一根SCL&#xff08;时钟线&#xff09;和一根SDA&#xff08;数据线&#xff09;组成&#xff0c;由于只有一根数据线&#xff0c;所以它是…...

33、Lua Cocos2d-x使用Luajit实现加密

项目要求对lua脚本进行加密&#xff0c;查了一下相关的资料 &#xff0c;得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密&#xff0c;试了一下&#xff0c;确实可行。下面是使用原生的lua解释器编译字节码&#xff1a; 新建一个名为1.lua的文件&#xff0c;…...

spring 集成 mybatis

spring 集成 mybatis 1、spring对junit的支持1.1、对junit4的支持1.2 对junit5的支持 2、Spring6集成MyBatis3.52.1 实现步骤2.2 实现 1、spring对junit的支持 1.1、对junit4的支持 依赖 <?xml version"1.0" encoding"UTF-8"?> <project xml…...

rtpengine 的端点学习模式

端点学习模式&#xff08;endpoint-learning&#xff09; delayed|immediate|off|heuristic delayed 延迟模式&#xff0c;等待 3 秒钟&#xff0c;然后再提交到端点地址 immediate 立即模式&#xff0c;收到第一个 rtp 包之后立即学习&#xff0c;不等 3 秒 off 关闭模式…...

软考--软件设计师--试题六--工厂方法模式(Factory Method)

工厂方法模式(Factory Method) 1、意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪儿一个类&#xff0c;factory method使一个类的实例化延迟到其子类。 2、结构 3、适用性 a、当一个类不知道它所必须创建的对象的类的时候。 b、当一个类希望由它的子类来指定…...

PostgreSQL自带的命令行工具19- pg_checksums

PostgreSQL自带的命令行工具19- pg_checksums 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777pg_checksums 是…...

【SQL】SQL常见面试题总结(1)

目录 1、检索数据1.1、从 Customers 表中检索所有的 ID1.2、检索并列出已订购产品的清单1.2、检索所有列 2、排序检索数据2.1、检索顾客名称并且排序2.2、对顾客 ID 和日期排序2.3、按照数量和价格排序2.4、检查 SQL 语句 3、过滤数据3.1、返回固定价格的产品3.2、返回产品并且…...

Ubuntu 安装 eclipse 的详细过程及工程创建和编译配置

目录 一、安装环境二、下载依赖 java jdk三、下载 eclipse四、安装4.1 java 环境4.2 eclipse 安装4.3 打开 eclipse 五、配置 eclipse5.1 新建 C 工程5.2 工具链 配置5.3 头文件路径5.4 链接库5.5 编译 一、安装环境 Ubuntu 版本&#xff1a;22.04.3 位数&#xff1a;64-bit 二…...

制造企业数据管理:从数据到价值的转化

在数字化浪潮席卷全球的今天&#xff0c;制造企业面临着前所未有的机遇与挑战。如何从海量的数据中提取有价值的信息&#xff0c;将其转化为企业的核心竞争力&#xff0c;成为了每一个制造企业必须面对的问题。而数据管理&#xff0c;正是实现这一转化的关键所在。制造企业数据…...

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…...