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

12-1_Qt 5.9 C++开发指南_自定义插件和库-自定义Widget组件(提升法(promotion)创建自定义定制化组件)

当UI设计器提供的界面组件不满足实际设计需求时,可以从 QWidget 继承自定义界面组件。

有两种方法使用自定义界面组件:

  • 一种是提升法(promotion),例如在8.3 节将一个QGraphicsView组件提升为自定义的 QWGraphicsView 类,提升法用于界面可视化设计时不够直观,不能在界面上即刻显示自定义组件的效果;

  • 另一种是为 UI 设计器设计自定义界面组件的 Widget 插件,直接安装到 UI设计器的组件面板里,如同 Qt 自带的界面设计组件一样使用,在设计时就能看到组件的实际显示效果,只是编译和运行时需要使用到插件的动态链接库 (Windows 平台上)

本章先介绍这两种自定义 Widget 组件的设计和使用方法,再介绍Qt编写和使用静态链接库和共享库(Windows 平台上就是动态链接库)的方法

文章目录

  • 1. 自定义 Widget 子类QmyBattery
  • 2. 自定义Widget组件的使用
  • 3. 软件结构及源代码
    • 3.1 软件结构
    • 3.2 可视化UI设计
    • 3.3 源码

1. 自定义 Widget 子类QmyBattery

Qt的 UI 设计器提供了很多 GUI 设计的界面组件,可以满足常见的界面设计需求。但是某些时候需要设计特殊的界面组件,而在 UI设计器的组件面板里根本没有合适的组件,这时就需要设计自定义的界面组件。

所有界面组件的基类是QWidget,要设计自定义的界面组件,可以从QWidget继承一个自定义的类,重定义其painEvent()事件,利用Qt的绘图功能会追组件外观,并实现所需的其他功能。

例如,假设需要设计一个如下图所示的电池电量显示组件,用于电池使用或充电时显示其电量,但是在 UI 设计器的组件面板里是没有这样一个现成的组件的。这就需要设计一个自定义的Widget 组件。

在这里插入图片描述

为此,设计一个从QWidget 继承的类QmyBattery。创建C++类,可以单击 Qt Creator 的“File”一“New File or Project”菜单项,在出现的对话框里选择 C++类组里的 C++ Class,在向导中设置类的名称,并选择基类为 QWidget。

定义QmyBattery类的qmybattery.h 文件的完整代码如下:

#ifndef WBATTERY_H
#define WBATTERY_H#include    <QWidget>
#include    <QColor>class QmyBattery : public QWidget
{Q_OBJECT
//自定义属性Q_PROPERTY(int  powerLevel READ powerLevel WRITE setPowerLevel NOTIFY powerLevelChanged)private:QColor  mColorBack=Qt::white;//背景颜色QColor  mColorBorder=Qt::black;//电池边框颜色QColor  mColorPower=Qt::green;//电量柱颜色QColor  mColorWarning=Qt::red;//电量短缺时的颜色int mPowerLevel=60;//电量0-100int mWarnLevel=20;//电量低警示阈值protected:void    paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;public:explicit QmyBattery(QWidget *parent = 0);void    setPowerLevel(int pow);//设置当前电量int     powerLevel();void    setWarnLevel(int warn);//设置电量低阈值int     warnLevel();QSize   sizeHint();//报告缺省大小signals:void   powerLevelChanged(int );public slots:
};#endif // WBATTERY_H

在 private 部分定义了几个私有变量,主要是各种颜色的定义、当前电量值 mPowerLevel 和电量低阈值mWarLevel。
protected 部分重定义了 paintEvent()事件,在第8章中介绍过,QWidget 类的 paintEvent()事件用于界面绘制,在此事件里,可以使用 QPainter 的各种绘图功能绘制自己需要的界面。

public 部分定义了用于读取和设置当前电量值、电量低阈值的函数,还定义了 sizeHint()函数用于返回组件缺省大小。

定义了一个信号 powerLevelChanged(int),在当前电量值改变时发射该信号,使用QmyBattery类时可以设计槽函数对此信号做处理。
下面是 QmyBattery 类的实现代码,复杂一点的部分是 paintEvent()事件函数里绘制界面的功能实现,这里设置了窗口逻辑坐标,所以,当组件大小变化时,绘制的电池大小也会自动变化。QPainter 绘图的功能在第 8 章有详细介绍,这里不再详细解释。

#include "qmybattery.h"#include    <QPainter>void QmyBattery::paintEvent(QPaintEvent *event)
{  //界面组件的绘制Q_UNUSED(event);QPainter    painter(this);QRect rect(0,0,width(),height()); //viewport矩形区painter.setViewport(rect);//设置Viewportpainter.setWindow(0,0,120,50); // 设置窗口大小,逻辑坐标painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::TextAntialiasing);//绘制电池边框QPen    pen;//设置画笔pen.setWidth(2); //线宽pen.setColor(mColorBorder); //划线颜色pen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等pen.setCapStyle(Qt::FlatCap);//线端点样式pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式painter.setPen(pen);QBrush  brush;//设置画刷brush.setColor(mColorBack); //画刷颜色brush.setStyle(Qt::SolidPattern); //画刷填充样式painter.setBrush(brush);rect.setRect(1,1,109,48);painter.drawRect(rect);//绘制电池边框brush.setColor(mColorBorder); //画刷颜色painter.setBrush(brush);rect.setRect(110,15,10,20);painter.drawRect(rect); //画电池正极头//画电池柱if (mPowerLevel>mWarnLevel){  //正常颜色电量柱brush.setColor(mColorPower); //画刷颜色pen.setColor(mColorPower); //划线颜色}else{ //电量低电量柱brush.setColor(mColorWarning); //画刷颜色pen.setColor(mColorWarning); //划线颜色}painter.setBrush(brush);painter.setPen(pen);if (mPowerLevel>0){rect.setRect(5,5,mPowerLevel,40);painter.drawRect(rect);//画电池柱}//绘制电量百分比文字QFontMetrics    textSize(this->font());QString powStr=QString::asprintf("%d%%",mPowerLevel);QRect textRect=textSize.boundingRect(powStr);//得到字符串的rectpainter.setFont(this->font());pen.setColor(mColorBorder); //划线颜色painter.setPen(pen);painter.drawText(55-textRect.width()/2,23+textRect.height()/2,powStr);
}QmyBattery::QmyBattery(QWidget *parent) : QWidget(parent)
{
//    setPalette(QPalette(mColorBack));
//    setAutoFillBackground(true);
//    this->resize(120,50);
}void QmyBattery::setPowerLevel(int pow)
{ //设置当前电量值mPowerLevel=pow;emit powerLevelChanged(pow); //触发信号repaint();
}int QmyBattery::powerLevel()
{ //读取当前电量值return mPowerLevel;
}void QmyBattery::setWarnLevel(int warn)
{//设置电量低阈值mWarnLevel=warn;repaint();
}int QmyBattery::warnLevel()
{//读取电量低阈值return  mWarnLevel;
}QSize QmyBattery::sizeHint()
{//报告缺省大小,调整比例int H=this->height();int W=H*12/5;QSize   size(W,H);return size;
}

2. 自定义Widget组件的使用

实现了QmyBattery 类之后,若是用代码创建QmyBattery 类对象,其使用与一般的组件类是一样的;若是在 UI设计器中使用 QmyBattery,则需要采用提升法(promotion)。

实例 samp12 1是一个基于 QWidegt 的应用程序,使用 UI 设计器设计主窗体时,在窗体上放置一个QWidegt 类组件,然后鼠标右键调出其快捷菜单,单击“Promote to”菜单项,会出现如下图所示的对话框。

在这里插入图片描述

此对话框里,在基类名称下拉列表框里选择 QWidget,将提升后的类名称设置为 QmyBattery,头文件名称会自动生成。可以将设置添加到已提升类的列表里,以便重复使用。

设置后,单击“Promote”按钮,就可以将此QWidget 组件提升为 QmyBattery 类。提升后,在 Property Editor 里会看到这个组件的类名称变为了 QmyBattery。然后,将其 objectName 更改为 battery。

虽然界面上放置的 QWidget 组件被提升为了 QmyBattery 类,但是在这个组件的“Go to slot’对话框里并没有QmyBattery 类的 powerLevelChanged(int) 信号,无法采用可视化方法生成信号的槽函数。

在主窗口上放置一个 QSlider 组件和一个 QLabel 组件。滑动标尺改变数值时,设置为 battery的当前电量值,其 valueChanged()信号的槽函数代码如下:

void Widget::on_horizontalSlider_valueChanged(int value)
{ui->battery->setPowerLevel(value);QString  str=QStringLiteral("当前电量:")+QString::asprintf("%d %%",value);ui->LabInfo->setText(str);
}

battery 的各种参数采用其缺省的设置,battery 的当前电量值改变时,内部会调用 paintEvent()事件代码重新绘制电池显示效果。

3. 软件结构及源代码

3.1 软件结构

在这里插入图片描述

3.2 可视化UI设计

在这里插入图片描述

3.3 源码

(1)qmybattery.h

#ifndef WBATTERY_H
#define WBATTERY_H#include    <QWidget>
#include    <QColor>class QmyBattery : public QWidget
{Q_OBJECT
//自定义属性Q_PROPERTY(int  powerLevel READ powerLevel WRITE setPowerLevel NOTIFY powerLevelChanged)private:QColor  mColorBack=Qt::white;//背景颜色QColor  mColorBorder=Qt::black;//电池边框颜色QColor  mColorPower=Qt::green;//电量柱颜色QColor  mColorWarning=Qt::red;//电量短缺时的颜色int mPowerLevel=60;//电量0-100int mWarnLevel=20;//电量低警示阈值protected:void    paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;public:explicit QmyBattery(QWidget *parent = 0);void    setPowerLevel(int pow);//设置当前电量int     powerLevel();void    setWarnLevel(int warn);//设置电量低阈值int     warnLevel();QSize   sizeHint();//报告缺省大小signals:void   powerLevelChanged(int );public slots:
};#endif // WBATTERY_H

(2)qmybattery.cpp

#include "qmybattery.h"#include    <QPainter>void QmyBattery::paintEvent(QPaintEvent *event)
{  //界面组件的绘制Q_UNUSED(event);QPainter    painter(this);QRect rect(0,0,width(),height()); //viewport矩形区painter.setViewport(rect);//设置Viewportpainter.setWindow(0,0,120,50); // 设置窗口大小,逻辑坐标painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::TextAntialiasing);//绘制电池边框QPen    pen;//设置画笔pen.setWidth(2); //线宽pen.setColor(mColorBorder); //划线颜色pen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等pen.setCapStyle(Qt::FlatCap);//线端点样式pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式painter.setPen(pen);QBrush  brush;//设置画刷brush.setColor(mColorBack); //画刷颜色brush.setStyle(Qt::SolidPattern); //画刷填充样式painter.setBrush(brush);rect.setRect(1,1,109,48);painter.drawRect(rect);//绘制电池边框brush.setColor(mColorBorder); //画刷颜色painter.setBrush(brush);rect.setRect(110,15,10,20);painter.drawRect(rect); //画电池正极头//画电池柱if (mPowerLevel>mWarnLevel){  //正常颜色电量柱brush.setColor(mColorPower); //画刷颜色pen.setColor(mColorPower); //划线颜色}else{ //电量低电量柱brush.setColor(mColorWarning); //画刷颜色pen.setColor(mColorWarning); //划线颜色}painter.setBrush(brush);painter.setPen(pen);if (mPowerLevel>0){rect.setRect(5,5,mPowerLevel,40);painter.drawRect(rect);//画电池柱}//绘制电量百分比文字QFontMetrics    textSize(this->font());QString powStr=QString::asprintf("%d%%",mPowerLevel);QRect textRect=textSize.boundingRect(powStr);//得到字符串的rectpainter.setFont(this->font());pen.setColor(mColorBorder); //划线颜色painter.setPen(pen);painter.drawText(55-textRect.width()/2,23+textRect.height()/2,powStr);
}QmyBattery::QmyBattery(QWidget *parent) : QWidget(parent)
{
//    setPalette(QPalette(mColorBack));
//    setAutoFillBackground(true);
//    this->resize(120,50);
}void QmyBattery::setPowerLevel(int pow)
{ //设置当前电量值mPowerLevel=pow;emit powerLevelChanged(pow); //触发信号repaint();
}int QmyBattery::powerLevel()
{ //读取当前电量值return mPowerLevel;
}void QmyBattery::setWarnLevel(int warn)
{//设置电量低阈值mWarnLevel=warn;repaint();
}int QmyBattery::warnLevel()
{//读取电量低阈值return  mWarnLevel;
}QSize QmyBattery::sizeHint()
{//报告缺省大小,调整比例int H=this->height();int W=H*12/5;QSize   size(W,H);return size;
}

(3) widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{ui->battery->setPowerLevel(value);QString  str=QStringLiteral("当前电量:")+QString::asprintf("%d %%",value);ui->LabInfo->setText(str);
}

相关文章:

12-1_Qt 5.9 C++开发指南_自定义插件和库-自定义Widget组件(提升法(promotion)创建自定义定制化组件)

当UI设计器提供的界面组件不满足实际设计需求时&#xff0c;可以从 QWidget 继承自定义界面组件。 有两种方法使用自定义界面组件&#xff1a; 一种是提升法(promotion)&#xff0c;例如在8.3 节将一个QGraphicsView组件提升为自定义的 QWGraphicsView 类&#xff0c;提升法用…...

【软件测试学习】—软件测试的基本认识(一)

【软件测试学习】—软件测试的基本认识&#xff08;一&#xff09; 文章目录 【软件测试学习】—软件测试的基本认识&#xff08;一&#xff09;一、什么是软件测试二、软件测试的目的三、测试的原则四、测试的标准五、测试的基本要求六、bug的由来七、测试的流程八、开发模式九…...

Unity AI项目笔记

一、创建虚拟环境 在开始进行Unity AI项目之前&#xff0c;首先需要设置一个适当的虚拟环境。以下步骤将会指导你如何创建&#xff1a; 下载Python 3.7。下载Anaconda 2020.11。可以在清华大学开源软件镜像站找到镜像资源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/a…...

如何在地图上寻找峨眉山零公里的龙洞湖

爬峨眉山的需要&#xff0c;住在零公里附近。 据说这附近有个好玩的地方叫龙洞湖&#xff0c;我们住得远&#xff0c;想步行去看看。拿出地图&#xff0c;搜龙洞湖&#xff0c;尴尬了。搜不到具体位置。细想&#xff0c;人家整个村就叫龙洞村&#xff0c;地图上居然没有标识&a…...

cloudstack平台host加入后,显示CPU speed为0GHz

一、环境说明 操作系统&#xff1a;openEuler 22.03CPU&#xff1a;Kunpeng-920&#xff0c;arm v8cloudstack&#xff1a;4.18libvirtd&#xff1a;6.2.0 二、问题描述 cloudstack平台初始化完成后&#xff0c;第一次加入host&#xff0c;系统虚拟机一直无法正常创建&#…...

创新技术应用,提升企业图文档管理水平的新思路

信息爆炸和数字化发展的时代&#xff0c;企业图文档管理显得尤为重要。传统的纸质文件管理方式已经无法满足企业高效、安全、便捷管理的需求。因此&#xff0c;创新技术的应用成为了提升企业图文档管理水平的必然选择。PDM&#xff08;产品数据管理&#xff09;与BOM&#xff0…...

网络安全 Day22-mariadb数据库用户管理

数据库用户管理 1. mariadb数据库用户管理2. mariadb数据库用户授权3. 用户回收授权4. 使客户端连接数据库 1. mariadb数据库用户管理 用户的格式: 用户主机范围 合起来才算一个用户授权主机范围 只能从本机访问: localhost或127.0.0.1或10.0.0.166(指定IP)授权整个网段: 授权…...

SERDES关键技术

目录 一、SERDES介绍 二、SERDES关键技术 2.1 多重相位技术 2.2 线路编解码技术 2.2.1 8B/10B编解码 2.2.2 控制字符&#xff08;Control Characters&#xff09; 2.2.3 Comma检测 2.2.4 扰码&#xff08;Scrambling&#xff09; 2.2.5 4B/5B与64B/66B编解码技术 2.3 包传…...

小程序如何上传商品图片

了解如何在小程序商城中上传商品图片是非常重要的&#xff0c;因为商品图片的质量和展示效果直接影响到用户对商品的购买决策。下面&#xff0c;我将介绍怎么在小程序上传产品图片的方法和注意事项。 1. 图片准备&#xff1a;在上传商品图片之前&#xff0c;首先要准备好商品图…...

vue中人员导出功能实现

大纲&#xff1a; 1、导出定义的export.js文件 代码展示 import axios from axios //导出一 export const exportExcel (url, params, name, type post) > {// url url路径 params 查询参数 name 文件名 type 请求方式axios[type](url, params, {responseType: blob,}).t…...

【微信小程序】引入第三方库poke对GZIP压缩数据进行解压

使用 npm 包管理工具&#xff1a; 首先&#xff0c;在小程序的根目录下执行 npm init 初始化项目&#xff0c;生成 package.json 文件。然后&#xff0c;通过 npm 安装 pako&#xff1a;npm install pako。接下来&#xff0c;在小程序的根目录下创建一个名为 miniprogram_npm 的…...

Pandas操作Excel

Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析。 菜鸟教程&#xff1a;https://www.runoob.com/pandas/pandas-tutorial.html 读取Excel pd.read_excel(path,sheet_name,header) path&#xff1a;excel文件路径sheet_name&#xff1a;读取的sheet&#xff0…...

leetcode 712. Minimum ASCII Delete Sum for Two Strings(字符串删除字母的ASCII码之和)

两个字符串s1, s2, 删除其中的字母使s1和s2相等。 问删除字母的最小ASCII码之和是多少。 思路&#xff1a; DP 先考虑极端的情况&#xff0c;s1为空&#xff0c;那么要想达到s2和s1相等&#xff0c;就要把s2中的字母删完&#xff0c; ASCII码之和就是s2中所有字母的ASCII码之…...

Springboot -- 按照模板生成docx、pdf文件,docx转pdf格式

使用 poi-tl 根据模板生成 word 文件。 使用 xdocreport 将 docx 文件转换为 pdf 文件。 xdocreport 也支持根据模板导出 word &#xff0c;但是 poi-tl 的功能更齐全&#xff0c;操作更简单&#xff0c;文档清晰。 poi-tl 、xdocreport 内部均依赖了 poi &#xff0c;要注意两…...

UE5.1.1 创建C++项目失败

因一直使用Unity开发环境&#xff0c;安装Unreal后&#xff0c;并未详细配置过其开发环境&#xff0c;默认创建蓝图工程无异常&#xff0c;但创建UE C项目时总共遇到两个错误&#xff1a; 错误一 Running /Epic/UE/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -…...

windows进行端口映射

windows进行端口映射 1. 查询端口映射情况 netsh interface portproxy show v4tov42. 查询某一个IP的所有端口映射情况 netsh interface portproxy show v4tov4 | find "[IP]" # 例&#xff1a; netsh interface portproxy show v4tov4 | find "192.168.1.1&quo…...

Python 异常处理

Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 异常处理: 本站Python教程会具体介绍。断言(Assertions):本站Python教程会具体介绍。 python标准异常 异常名称描述BaseException所有异常的…...

C++ 类的静态成员

在结构化程序设计中程序模块的基本单位是函数&#xff0c;因此模块间对内存中数据的共享是通过函数与和函数之间的数据共享来实现的&#xff0c;其中包括两个途径——参数传递和全局变量。 面向对象的程序设计方法兼顾数据的共享和保护&#xff0c;将数据与操作数据的函数封装…...

360T7路由器进行WiFi无线中继教程

360T7路由器进行WiFi中继教程 1. 概述2. 360T7路由器进行WiFi中继实现教程2.1 登录路由器管理界面2.2 选择上网方式2.3 搜索WiFi2.4 连接WiFi2.5 点击确认2.6 在主页面查看网络 1. 概述 中继路由系统由一组中继路由器组成&#xff0c;为不能交换路由信息的路由域提供中继路由。…...

主成分分析

主成分分析 相关概念方差协方差协方差矩阵特征值和特征向量 主成分分析数据降维主成分分析原理主成分分析过程sklearn库中的PCA主成分分析实现案例 相关概念 方差 方差是一个用来衡量一组数据离散程度的统计量&#xff0c;它是各样本与样本均值的差的平方和的平均值。方差越大…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...