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

Qt开发:元对象系统的介绍和使用

文章目录

    • 概述
    • 元对象系统的概念和组成
    • QObject 的详细介绍
      • 1.QObject 的主要特性
        • 信号与槽机制
        • 动态属性
        • 对象树(Object Trees)
        • 事件处理
      • 2.QMetaObject的主要特性
        • 函数签名
        • 常用功能

概述

Qt本身并不是一种编程语言,它实质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。Qt对标准C++进行了扩展,引入了一些新的概念和功能,例如信号与槽、对象属性等。Qt的元对象编译器(Meta-Object Compiler, MOC)是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。Qt Core模块是Qt类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目,Qt Core模块则是被自动加入的。Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换。

元对象系统的概念和组成

QObject是Qt的元对象系统的基础类,它为对象提供了信号与槽机制、对象树、事件处理等功能。QMetaObject是描述类元信息的对象,用于存储类的元数据,包括类名、信号、槽、属性、方法等。每个继承QObject的类都隐式包含一个静态的QMetaObject。另外QMetaProperty表示类的属性,可以通过它动态访问对象的属性。QMetaMethod表示类的方法,可以用于动态调用对象的方法。
元对象系统由以下三个基础组成:

  1. QObject类是所有使用元对象系统的类的基类。
  2. 在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。
  3. MOC(元对象编译器)为每个QObject的子类提供必要的代码来实现元对象系统的特性。构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和链接。

QObject 的详细介绍

QObject 是 Qt 框架中所有对象模型的基础类,几乎所有的 Qt 类(如 QWidget, QTimer, QThread 等)都直接或间接继承自 QObject。它提供了 Qt 元对象系统的核心功能,包括信号与槽机制、动态属性、事件处理、对象树结构等。

1.QObject 的主要特性

信号与槽机制

支持对象间松耦合的通信。
定义信号和槽的方式:用 signals 关键字定义信号;用 slots 关键字或使用任何公开的 public 方法定义槽。
信号与槽机制常用成员函数:

QObject::connect():连接信号与槽。
QObject::disconnect():断开信号与槽。
QObject::signalsBlocked():检查信号是否被阻塞。
QObject::blockSignals():阻塞或恢复信号。
#include <QObject>
#include <QDebug>class MyObject : public QObject {Q_OBJECTpublic:MyObject(QObject *parent = nullptr) : QObject(parent) {}signals:void mySignal(int value);public slots:void mySlot(int value) {qDebug() << "Slot received value:" << value;}
};int main() {MyObject obj1, obj2;QObject::connect(&obj1, &MyObject::mySignal, &obj2, &MyObject::mySlot);emit obj1.mySignal(42);  // 触发信号return 0;
}
动态属性

QObject 提供了动态属性支持,可以在运行时为对象添加或修改属性。

属性常用成员函数:

QObject::setProperty(const char *name, const QVariant &value):设置动态属性。
QObject::property(const char *name):获取动态属性。
QObject::dynamicPropertyNames():获取所有动态属性的名称。
#include <QObject>
#include <QDebug>int main() {QObject obj;obj.setProperty("dynamicProperty", 123);qDebug() << "Property value:" << obj.property("dynamicProperty").toInt();foreach (const QByteArray &propName, obj.dynamicPropertyNames()) {qDebug() << "Property name:" << propName;}return 0;
}
对象树(Object Trees)

QObject 通过父子关系管理对象生命周期。
一个对象的子对象会在父对象销毁时自动销毁。

对象树管理常用成员函数:

QObject::setParent(QObject *parent):设置父对象。
QObject::parent():获取父对象。
QObject::children():获取子对象列表。
#include <QObject>
#include <QDebug>int main() {QObject parent;QObject child1(&parent);QObject child2(&parent);qDebug() << "Parent has" << parent.children().size() << "children";return 0;
}
事件处理

支持基于事件的编程,提供事件队列和事件分发机制。
通过重载 QObject::event() 或特定事件处理函数(如 mousePressEvent)处理事件。

事件处理常用成员函数:

QObject::event(QEvent *event):捕获所有事件。
QObject::installEventFilter(QObject *filterObj):安装事件过滤器。
QObject::eventFilter(QObject *watched, QEvent *event):实现自定义事件过滤逻辑。
#include <QObject>
#include <QDebug>
#include <QEvent>class MyFilter : public QObject {Q_OBJECTprotected:bool eventFilter(QObject *watched, QEvent *event) override {qDebug() << "Event filtered for" << watched << "Event type:" << event->type();return QObject::eventFilter(watched, event);}
};int main() {QObject obj;MyFilter filter;obj.installEventFilter(&filter);QEvent event(QEvent::User);QCoreApplication::sendEvent(&obj, &event);return 0;
}

2.QMetaObject的主要特性

函数签名
const QMetaObject *QObject::metaObject() const;

返回值:

返回一个指向 QMetaObject 的指针,包含调用对象的元信息。
QMetaObject 包含类的信号、槽、属性、方法和父类等元信息。

QObject::metaObject() 是 Qt 元对象系统的一部分,用于在运行时获取 QObject 对象的元信息。通过它可以访问与类相关的元数据,例如类名、父类信息、信号、槽、属性、方法等。
通常在以下场景中非常有用:

  1. 反射与动态调用:获取类的动态信息,调用类的槽或普通方法。
  2. 属性访问:获取动态或静态属性。
  3. 插件系统:通过元对象动态加载功能模块。
常用功能

通过 metaObject() 返回的元对象,可以调用以下 QMetaObject 的方法来获取类的信息。
获取基本信息:

className():返回类名。
superClass():返回父类的 QMetaObject。
#include <QObject>
#include <QDebug>class MyClass : public QObject {Q_OBJECT
};int main() {MyClass obj;const QMetaObject *metaObject = obj.metaObject();qDebug() << "Class name:" << metaObject->className();qDebug() << "Superclass name:" << (metaObject->superClass() ? metaObject->superClass()->className() : "No superclass");return 0;
}

在这里插入图片描述
方法信息:

methodCount():返回类中所有方法的数量。
method():按索引获取方法的元信息。
indexOfMethod():通过方法签名获取方法索引。
invokeMethod():动态调用方法。
#include <QObject>
#include <QDebug>class MyClass : public QObject {Q_OBJECTpublic slots:void mySlot(const QString &text) {qDebug() << "Slot called with text:" << text;}
};int main() {MyClass obj;const QMetaObject *metaObject = obj.metaObject();int methodIndex = metaObject->indexOfMethod("mySlot(QString)");if (methodIndex != -1) {QMetaMethod method = metaObject->method(methodIndex);method.invoke(&obj, Q_ARG(QString, "Hello, Qt!"));}return 0;
}

在这里插入图片描述
属性信息:

propertyCount():返回类中所有属性的数量。
property():按索引获取属性的元信息。
indexOfProperty():通过属性名获取属性索引。
#include <QObject>
#include <QDebug>class MyClass : public QObject {Q_OBJECTQ_PROPERTY(int id MEMBER m_id)Q_PROPERTY(QString name MEMBER m_name)public:MyClass(QObject *parent = nullptr) : QObject(parent), m_id(42), m_name("MyClass") {}private:int m_id;QString m_name;
};int main() {MyClass obj;const QMetaObject *metaObject = obj.metaObject();for (int i = 0; i < metaObject->propertyCount(); ++i) {QMetaProperty property = metaObject->property(i);qDebug() << "Property:" << property.name() << "Value:" << obj.property(property.name());}return 0;
}

在这里插入图片描述
信号与槽:

indexOfSignal():通过信号签名获取信号索引。
indexOfSlot():通过槽签名获取槽索引。
#include <QObject>
#include <QDebug>class MyClass : public QObject {Q_OBJECTsignals:void mySignal();void anotherSignal(int value);public slots:void mySlot() {}void anotherSlot(int value) {}
};int main() {MyClass obj;const QMetaObject *metaObject = obj.metaObject();qDebug() << "Signals:";for (int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i) {QMetaMethod method = metaObject->method(i);if (method.methodType() == QMetaMethod::Signal) {qDebug() << "Signal:" << method.methodSignature();}}qDebug() << "Slots:";for (int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i) {QMetaMethod method = metaObject->method(i);if (method.methodType() == QMetaMethod::Slot) {qDebug() << "Slot:" << method.methodSignature();}}return 0;
}

在这里插入图片描述
QMetaObject::invokeMethod的介绍
QMetaObject::invokeMethod 是 Qt 的元对象系统提供的一个强大的方法,用于在运行时以动态的方式调用一个 QObject 的成员函数(包括普通方法和槽)。它一般在以下场景非常有用:

  1. 动态调用对象的成员函数。
  2. 在多线程环境中,通过跨线程调用信号/槽的方式安全地调用对象方法。
  3. 不需要在编译时知道方法名称,可以根据字符串动态查找并调用方法。

QMetaObject::invokeMethod 的函数签名:

bool QMetaObject::invokeMethod(QObject *object,const char *member,Qt::ConnectionType type = Qt::AutoConnection,QGenericReturnArgument ret = QGenericReturnArgument(nullptr),QGenericArgument val0 = QGenericArgument(nullptr),QGenericArgument val1 = QGenericArgument(),QGenericArgument val2 = QGenericArgument(),QGenericArgument val3 = QGenericArgument(),QGenericArgument val4 = QGenericArgument(),QGenericArgument val5 = QGenericArgument(),QGenericArgument val6 = QGenericArgument(),QGenericArgument val7 = QGenericArgument(),QGenericArgument val8 = QGenericArgument(),QGenericArgument val9 = QGenericArgument()
);

主要参数说明:

1.object:调用目标对象。
2.member:要调用的函数名(包括槽函数)。
3.type:指定调用方式,通常与线程相关。 常用值: Qt::DirectConnection:直接在当前线程调用。 Qt::QueuedConnection:将调用放入目标线程的事件队列。
Qt::BlockingQueuedConnection:在多线程中阻塞调用线程,直到目标线程完成调用。
Qt::AutoConnection(默认):根据对象所属线程自动选择。
4.ret:返回值(可选)。
5.val0 到 val9:最多支持 10 个参数,使用 Q_ARG 宏进行包装。

调用无参数函数

#include <QObject>
#include <QDebug>class MyObject : public QObject {Q_OBJECTpublic slots:void mySlot() {qDebug() << "mySlot() called!";}
};int main() {MyObject obj;QMetaObject::invokeMethod(&obj, "mySlot");return 0;
}

调用带参数的函数

#include <QObject>
#include <QDebug>class MyObject : public QObject {Q_OBJECTpublic slots:void mySlot(const QString &text, int value) {qDebug() << "mySlot() called with text:" << text << "and value:" << value;}
};int main() {MyObject obj;QMetaObject::invokeMethod(&obj, "mySlot",Q_ARG(QString, "Hello, Qt!"),Q_ARG(int, 42));return 0;
}

获取返回值

#include <QObject>
#include <QDebug>class MyObject : public QObject {Q_OBJECTpublic:Q_INVOKABLE QString myMethod(const QString &text) {return "Received: " + text;}
};int main() {MyObject obj;QString returnValue;QMetaObject::invokeMethod(&obj, "myMethod",Q_RETURN_ARG(QString, returnValue),Q_ARG(QString, "Invoke Example"));qDebug() << "Return value:" << returnValue;return 0;
}

多线程中的使用
QMetaObject::invokeMethod 的 Qt::QueuedConnection 方式可以在多线程环境下调用槽函数。

#include <QObject>
#include <QThread>
#include <QDebug>class Worker : public QObject {Q_OBJECTpublic slots:void process() {qDebug() << "Worker process() running in thread:" << QThread::currentThread();}
};int main() {Worker worker;QThread workerThread;worker.moveToThread(&workerThread);workerThread.start();QMetaObject::invokeMethod(&worker, "process", Qt::QueuedConnection);workerThread.quit();workerThread.wait();return 0;
}

相关文章:

Qt开发:元对象系统的介绍和使用

文章目录 概述元对象系统的概念和组成QObject 的详细介绍1.QObject 的主要特性信号与槽机制动态属性对象树&#xff08;Object Trees&#xff09;事件处理 2.QMetaObject的主要特性函数签名常用功能 概述 Qt本身并不是一种编程语言&#xff0c;它实质上是一个跨平台的C开发类库…...

.vscode文件中各个脚本需要修改的地方

NOTE&#xff1a; 此篇文章由VSCode编辑GCC for ARM交叉编译工具链Makefile构建OpenOCD调试&#xff08;基于STM32的标准库&#xff09;派生而来&#xff0c;对.vscode文件中各个脚本需要修改的地方作补充说明。 tasks.json 该json文件的主要作用&#xff1a;使用XX名称去执行…...

JavaScript模块化规范

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…...

第二篇:k8s工作流程

我们来看通过deployment部署pod的常规流程&#xff1a; kubectl向apiserver发送部署请求&#xff08;例如使用 kubectl create -f deployment.yml&#xff09;apiserver将 Deployment 持久化到etcd&#xff1b;etcd与apiserver进行一次http通信。controller manager通过watch a…...

什么是数据架构?

数据架构是如何使用数据的蓝图--它是数据和数据相关资源的高层结构&#xff0c;是整个组织的数据框架&#xff0c;包括模型、规则和标准。通过高效的数据架构&#xff0c;企业可以跟踪整个 IT 基础设施中数据的获取、移动、存储、安全性和可访问性。 数据架构总览 数据架构是…...

ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算——从0基础到15个案例实战

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…...

微信小程序权限授权工具类

最近写微信小程序的时候需要在页面获取设备权限&#xff0c;又不想每个页面都写&#xff0c;就写了一个工具类方便管理 /*** 权限工具类用于获取授权* 权限工具类使用方法&#xff0c;注意调用时函数需要定义为异步函数 async* import PermissionUtils from "./permissio…...

CT中的2D、MPR、VR渲染、高级临床功能

CT中的2D、MPR、VR渲染 在CT&#xff08;计算机断层扫描&#xff09;中&#xff0c;2D、MPR&#xff08;多平面重建&#xff09;、VR&#xff08;体积渲染&#xff09;是不同的图像显示和处理技术&#xff0c;它们各自有独特的用途和优势。下面分别介绍这三种技术&#xff1a;…...

【MySQL】Windows下重启MySQL服务时,报错:服务名无效

1、问题描述 在终端中&#xff0c;停止、启动MySQL服务时报错&#xff1a;服务名无效 2、原因分析 1&#xff09;权限不够 如果是权限不够&#xff0c;会提示&#xff1a;系统错误5&#xff0c;拒绝访问。 2&#xff09;服务名错误 如果是服务名错误&#xff0c;会提示“…...

java枚举的基本用法

在 Java 中&#xff0c;枚举&#xff08;enum&#xff09;是一种特殊的类&#xff0c;用于定义一组常量。它可以使代码更具可读性和可维护性。枚举类型可以用于表示固定的、有限的值集合&#xff0c;比如星期几、季节、方向等。 以下是一些常见的枚举用法示例&#xff1a; 1.…...

Web网络安全

一. 浏览器系统安全方面&#xff0c;使用多进程方案&#xff0c;而js主线程运行在渲染进程中&#xff0c;渲染进程时运行在沙箱中的&#xff0c;没有对本地OS文件的直接读写权限&#xff0c;所以需要通过IPC与浏览器主线程通信&#xff0c;才可以获取cookie等信息&#xff0c;这…...

【分子材料发现】——GAP:催化过程中吸附构型的多模态语言和图学习(数据集处理详解)(二)

Multimodal Language and Graph Learning of Adsorption Configuration in Catalysis https://arxiv.org/abs/2401.07408Paper Data: https://doi.org/10.6084/m9.figshare.27208356.v2 1 Dataset CatBERTa训练的文本字符串输入来源于Open Catalyst 2020 &#xff08;OC20…...

matlab Delaunay三角剖分提取平面点云的边界

目录 一、算法原理1、算法概述2、参考文献二、代码实现三、结果展示四、详细过程版一、算法原理 1、算法概述 Delaunay三角网在生成三角网过程中,以最近的三点形成三角形,且各三角形的边皆不相交,每条边都使用所在的三角形的顶点验算并记录相应的2个顶点坐标。整个验算过程…...

Spring07——AOP通知以及几个相关案例

切入点表达式 注意&#xff0c;不是参数&#xff0c;是参数类型 可以使用通配符描述切入点&#xff0c;快速描述 ■ *&#xff1a;单个独立的任意符号&#xff0c;可以独立出现&#xff0c;也可以作为前缀或者后缀的通配符出现 execution(public∗com.itheima.∗.UserServi…...

【AI工具】强大的AI编辑器Cursor详细使用教程

目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日&#xff0c;由四名麻省理工学院&#xff08;MIT&#xff09;本科生共同创立的Anysphere公司宣布&#xff0c;其开发的AI代码编辑器Cursor在成立短短两年…...

CV工程师专用键盘开源项目硬件分析

1、前言 作为一个电子发烧友&#xff0c;你是否有遇到过这样的问题呢。当我们去查看函数定义的时候&#xff0c;需要敲击鼠标右键之后选择go to definition。更高级一些&#xff0c;我们使用键盘的快捷键来查看定义&#xff0c;这时候可以想象一下&#xff0c;你左手按下ALT&a…...

STM32标准固件库官网下载方法

Keil标准固件库官网下载方法 Keil中DFP.pack下载方法 打开keil官网 Keil 官网 www.keil.com 点击产品 点击“Products” 点击 “Arm Cortex-M” 下拉找到CMSIS-Packs 点击CMSIS-Pack index 搜索对应的MCU&#xff0c;我这里是STM32F4 注意搜索对应系列就好 点击下载...

数据库原理实验实验四 统计查询和组合查询

实验目的和要求加深对统计查询的理解,熟练使用聚簇函数。 实验环境SQL SERVER 2008 SQL Server Management Studio 20 实验内容与过程题目一: 学生(学号,年龄,性别,系名) 课程(课号,课名,学分,学时) 选课(学号,课号,成绩) 根据上面基本表的信息完成下列查…...

【电子通识】案例:USB Type-C USB 3.0线缆做直通连接器TX/RX反向

【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?-CSDN博客这个文章的后续。最近在做一个工装项目,需要用到USB Type-C线缆做连接。 此前已经做好了线序规划,结果新人做成实物后发现有的USB Type-C线缆可用,有的不行。其中发现USB3.0的TX-RX信号与自己的板卡…...

【Linux从青铜到王者】数据链路层(mac,arp)以及ip分片

局域网通信 通过之前的学习&#xff0c;我们了解了应用层&#xff0c;传输层&#xff0c;网络层的协议和作用&#xff0c;这里先做个总结 应用层——http&#xff0c;https协议&#xff0c;也可以自己定义一套&#xff0c;作用是进行数据的处理传输层——tcp&#xff0c;udp协…...

MyBatis注解开发

1.配置MyBatis_ssm配置mybits-CSDN博客 2.Mybaits实现增删改查-CSDN博客 3.MyBatis构建动态SQL-CSDN博客 目录 一、注解开发的定义 二、SQL常用注解 三、使用注解完成CRUD 1.查找所有 2.通过id查询 3.增加 4.更新 5.删除 6.查询数量 7.模糊查询 一、注解开发的定义 …...

Unity引擎UI滚动列表——滚动复用扩展应用

大家好&#xff0c;我是阿赵。   之前介绍了滚动复用的基础用法。上一个例子里面&#xff0c;是一个竖向单列的滚动列表展示。这一次来扩展一下用法。如果不知道上一次例子的&#xff0c;可以先往前翻一下&#xff0c;上面有例子的详情、原理解释和代码。 一、 多列的滚动复…...

MySQL 死锁排查

私人博客传送门 MySQL 死锁排查...

AI - 浅聊一下基于LangChain的AI Agent

AI - 浅聊一下基于LangChain的AI Agent 大家好&#xff0c;今天我们来聊聊一个很有意思的主题&#xff1a; AI Agent &#xff0c;就是目前非常流行的所谓的AI智能体。AI的发展日新月异&#xff0c;都2024年末了&#xff0c;如果此时小伙伴们对这个非常火的概念还不清楚的话&a…...

校园综合服务小程序+ssm

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园综合服务被用户普遍使用&#xff0c;为方便用户能够可…...

RPC设计--TcpConnection和TcpServer

TcpConnection 对于服务端来说用来封装clientfd&#xff0c;对于client端来说&#xff0c;就是封装connect函数返回后的fd. 处理此fd上的读写&#xff0c;因此需要为其提供read\write方法&#xff0c;其方法内部调用系统的read\write函数&#xff0c;从fd中读写数据。 当Fd上…...

Mysql 的 B+ 树是否包含行数据?

在 MySQL 中&#xff0c;是否在 B树 的叶子节点上存储完整的行数据&#xff0c;取决于使用的 存储引擎 和 索引类型&#xff1a; 聚簇索引 (Clustered Index) 叶子节点包含完整的行数据。 适用场景&#xff1a;MySQL InnoDB 存储引擎的主键索引&#xff08;或聚簇索引&#xf…...

CSS系列(2)-- 盒模型精解

前端技术探索系列&#xff1a;CSS 盒模型精解 &#x1f4e6; 致读者&#xff1a;深入理解盒模型的本质 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 盒模型&#xff0c;这是构建网页布局的核心概念。通过本文&#xff0c;你将全面理解盒模型的工作原理及…...

Matlab在信号处理领域有哪些典型的设计实例?

以下是Matlab在信号处理领域的一些典型设计实例&#xff1a; 一、信号生成与频谱分析 正弦信号生成与频谱分析 - 题目&#xff1a;生成一个频率为 f 10 H z f 10Hz f10Hz&#xff0c;采样频率为 f s 100 H z f_s100Hz fs​100Hz&#xff0c;时长为 T 5 s T 5s T5s的正弦…...

frida(objection)中x.ts到x.py封装路径

objection run "android hooking list classes" 基于sensepost/objection.git/1.11.0 sensepost/objection.git/e7eb1 简版路径: android hooking list classes --> show_android_classes --> android_hooking_get_classes androidHookingGetClasses --&g…...

python学习笔记—1—基础环境配置和字面量

1. 字面量 在代码中被写下来的固定值称为字面量 &#xff08;1&#xff09;整数字面量 666 &#xff08;2&#xff09;浮点字面量 6.66 &#xff08;3&#xff09;字符串字面量 "supercarrydoinb" 2. python中的数据类型 3. 打印字面量 print("666") …...

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…...

包管理器npm, cnpm, yarn 和 pnpm 的命令

npm (Node Package Manager) 安装与更新 npm install 或 npm i&#xff1a; 安装项目依赖&#xff1a;根据 package.json 文件安装所有列出的依赖。参数&#xff1a; -S, --save&#xff1a;保存到 dependencies&#xff08;默认行为&#xff09;。-D, --save-dev&#xff1a;…...

MATLAB 最小二乘平面拟合(90)

MATLAB 最小二乘平面拟合(90) 一、算法介绍二、算法实现1.代码2.结果:一、算法介绍 平面方程: ax+by+cz+d = 0 执行任务:读取一组点云(这里用自定义生成的平面模拟点云代替,在其中添加了噪声来模拟真实的数据),使用最小二乘拟合平面,来输出平面参数,并可视化显示拟…...

kubesphere服务报错 页面无法登陆

kubesphere的页面无法访问 查看pod服务&#xff0c;发现ks-apiserver的pod一直在重启 在所在node节点&#xff0c;执行dmesg -T 发现内存溢出 修改deploy的memory的配置 原本的request memory的值为100M 调整为2G 修改之后&#xff0c;服务正常启动&#xff0c;页面访问正常…...

filezilla连接不上虚拟机的解决方案

现象 解决过程 虚拟机终端输入ip addr 输出&#xff1a; 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever p…...

番茄钟与Todo List:用Go构建高效的时间管理工具

引言 在当今快节奏的世界中&#xff0c;时间管理和任务组织变得越来越重要。为了帮助用户提高效率&#xff0c;我开发了一个基于Golang的开源项目&#xff0c;基于fyne的ui&#xff0c;它结合了经典的番茄工作法&#xff08;Pomodoro Technique&#xff09;和功能丰富的待办事…...

vim实用命令整理(常用的命令)

本章教程,总结自己平时使用vim过程中,经常使用的命令,分享给大家。 一、高频使用 i:进入插入模式(光标处插入) a:进入插入模式(光标后插入) esc:返回普通模式 ::进入命令模式 :w:保存 :q:退出 :wq:保存并退出 :q!:强制退出不保存 :e filename:打开文件 :set n…...

METAGPT

METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORK MetaGPT&#xff1a;面向多代理协作框架的元编程 1. 引言 近年来&#xff0c;基于大型语言模型&#xff08;LLMs&#xff09;的多智能体系统在自动问题解决方面取得了显著进展。然而&#xff0c;现有的…...

LabVIEW调用Thorlabs的动态库进行开发

Thorlabs 产品在科研与生产领域中的应用广泛&#xff0c;当需要基于LabVIEW 进行二次开发时&#xff0c;可按照以下方法操作&#xff0c;以充分发挥设备性能并满足特定的项目需求。 创建 Kinesis LabVIEW 项目文件和文件夹 更详细的说明参见附件 在 LabVIEW 的启动界面中选择…...

Lua使用点号和冒号的区别

首先建立一个table&#xff0c;再分别定义两个方法&#xff0c;如下&#xff1a; local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…...

Rust学习笔记_13——枚举

Rust学习笔记_10——守卫 Rust学习笔记_11——函数 Rust学习笔记_12——闭包 枚举 文章目录 枚举1. 定义1.1 无值变体1.2 有值变体1.3 枚举与泛型的结合 2. 使用2.1 和匹配模式一起使用2.2 枚举作为类型别名 3. 常用枚举类型 在Rust编程语言中&#xff0c;枚举&#xff08;enum…...

集合框架(1)

集合框架&#xff08;1&#xff09; 1、数组的特点与弊端 &#xff08;1&#xff09;特点&#xff1a; 数组初始化以后&#xff0c;长度就确定了。数组中的添加的元素是依次紧密排列的&#xff0c;有序的&#xff0c;可以重复的。数组声明的类型&#xff0c;就决定了进行元素初…...

【Docker系列】Docker 构建多平台镜像:arm64 架构的实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

软件工程 概述

软件 不仅仅是一个程序代码。程序是一个可执行的代码&#xff0c;它提供了一些计算的目的。 软件被认为是集合可执行的程序代码&#xff0c;相关库和文档的软件。当满足一个特定的要求&#xff0c;就被称为软件产品。 工程 是所有有关开发的产品&#xff0c;使用良好定义的&…...

汽车产业数字化转型:协同创新破解挑战,平衡安全与流通

在数字经济时代的浪潮中&#xff0c;数据资源和数据信息已成为驱动各行各业转型升级的“新石油”。汽车产业&#xff0c;作为国民经济的重要支柱&#xff0c;正经历着前所未有的变革。随着数字化创新和转型的深入&#xff0c;数据在汽车全产业链中的作用和价值日益凸显。在这个…...

Oracle EBS PAC 如何复修非标任务单生产生非常大的PAC成本?

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 非标准任务单组件和装配相同物料A,俗称投入A产A。该物料A的期初数量为0。 上期成本假设为20,而本期成本爆增至563.674234。关键问题点: 由于该物料没有期初数量,无法通过“更新定期成本”指定“新期本…...

Docker 学习总结(84)—— Docker 常用运维命令

版本与信息查询 docker --version:查看安装的Docker版本。 docker info:获取Docker系统的详细配置信息。 镜像管理 docker images:列出本地所有镜像。 docker search IMAGE_NAME:搜索Docker Hub上的镜像。 docker pull IMAGE_NAME[:TAG]:从仓库下载指定镜像。 docker rmi …...

【MySQL】存储过程和触发器

MySQL存储过程和触发器 一、存储过程的介绍二、存储过程的相关操作2.1创建存储过程2.2查看存储过程2.4调用存储过程2.5删除存储过程 三、变量3.1系统变量3.2用户定义变量3.3局部变量 四、存储过程中的关键字4.1 if4.2参数4.3case4.4 while4.5repeat4.6 loop4.7游标4.8条件处理程…...

透彻理解并解决Mockito模拟框架的单元测试无法运行的问题

本篇的实例基于Maven IDE (VS Code) 运行 在VS Code 运行的时候&#xff0c; 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮&#xff0c;单击就可以运行使用Mockito 注解 ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。 不使用注…...