文章的目的为了记录使用C++ 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
 
相关链接:

开源 C++ QT Widget 开发(一)工程文件结构-CSDN博客

开源 C++ QT Widget 开发(二)基本控件应用-CSDN博客

开源 C++ QT Widget 开发(三)图表--波形显示器-CSDN博客

开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑-CSDN博客

 开源 C++ QT Widget 开发(五)通讯--串口调试-CSDN博客

开源 C++ QT Widget 开发(六)通讯--TCP调试-CSDN博客

开源 C++ QT Widget 开发(七)线程--多线程及通讯-CSDN博客

开源 C++ QT Widget 开发(八)网络--Http文件下载-CSDN博客

开源 C++ QT Widget 开发(九)图表--仪表盘-CSDN博客

开源 C++ QT Widget 开发(十)IPC进程间通信--共享内存-CSDN博客

开源 C++ QT Widget 开发(十一)进程间通信--Windows 窗口通信-CSDN博客

开源 C++ QT Widget 开发(十二)图表--环境监测表盘-CSDN博客



推荐链接:

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

内容:环境传感器监测面板

目录:

1.功能介绍

2.核心代码分析

3.所有源码

4.显示效果

一、功能介绍

实时数据监测:显示温度、湿度、PM2.5、光照强度和大气压力

可视化仪表盘:温度和PM2.5使用圆形仪表盘显示,带有彩色刻度

数据卡片:湿度、光照和压力使用卡片式布局

空气质量评级:根据PM2.5值自动显示空气质量等级

实时时钟:显示当前日期和时间

模拟数据更新:每2秒自动生成新的模拟传感器数据

二、核心代码分析

1.抗锯齿渲染:QPainter的Antialiasing确保平滑图形

使用setViewport和setWindow实现坐标系统一化

锥形渐变(QConicalGradient)创建彩色刻度弧

三角函数计算指针角度和位置

保存和恢复 painter 状态确保绘制隔离
 

2.自定义控件:GaugeWidget(仪表盘)和DataCardWidget(数据卡片)

CSS样式:使用QSS实现现代化界面风格

布局管理:嵌套布局实现灵活的界面结构

3.定时器系统:QTimer实现数据刷新和时钟更新

定时器系统:多定时器分别处理数据和时钟更新

三、所有源码

1.mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>
#include <QLabel>
#include <QGridLayout>
#include <QWidget>
#include <QTime>
#include <QVBoxLayout>
#include <QHBoxLayout>// 自定义仪表盘控件
class GaugeWidget : public QWidget
{Q_OBJECT
public:explicit GaugeWidget(QWidget *parent = nullptr, const QString &title = "",double minValue = 0, double maxValue = 100,const QString &unit = "", const QColor &color = Qt::blue);void setValue(double value);void setAlertLevels(double low, double medium, double high);protected:void paintEvent(QPaintEvent *event) override;private:QString m_title;double m_minValue;double m_maxValue;double m_currentValue;QString m_unit;QColor m_color;double m_lowAlert;double m_mediumAlert;double m_highAlert;
};// 数据卡片控件
class DataCardWidget : public QWidget
{Q_OBJECT
public:explicit DataCardWidget(QWidget *parent = nullptr,const QString &title = "",const QString &icon = "",const QString &unit = "");void setValue(double value);private:QLabel *m_valueLabel;QLabel *m_unitLabel;QLabel *m_titleLabel;QLabel *m_iconLabel;QString m_unit;
};class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void updateData();void updateTime();private:void setupUI();void setupSignals();QTimer *m_dataTimer;QTimer *m_clockTimer;// 主控件QWidget *m_centralWidget;QVBoxLayout *m_mainLayout;// 标题区域QLabel *m_titleLabel;QLabel *m_timeLabel;// 仪表盘区域QHBoxLayout *m_gaugeLayout;GaugeWidget *m_temperatureGauge;GaugeWidget *m_airQualityGauge;QLabel *m_airQualityLabel;// 数据卡片区域QHBoxLayout *m_dataCardLayout;DataCardWidget *m_humidityCard;DataCardWidget *m_lightCard;DataCardWidget *m_pressureCard;
};#endif // MAINWINDOW_H

2.mainwindow.cpp文件

#include "mainwindow.h"
#include <QPainter>
#include <QFont>
#include <QFontDatabase>
#include <QLinearGradient>
#include <QtMath>
#include <QRandomGenerator>// GaugeWidget 实现
GaugeWidget::GaugeWidget(QWidget *parent, const QString &title,double minValue, double maxValue,const QString &unit, const QColor &color): QWidget(parent), m_title(title), m_minValue(minValue), m_maxValue(maxValue),m_currentValue(minValue), m_unit(unit), m_color(color),m_lowAlert(0.3), m_mediumAlert(0.6), m_highAlert(0.8)
{setMinimumSize(250, 250); // 稍微调小一点
}void GaugeWidget::setValue(double value)
{m_currentValue = qBound(m_minValue, value, m_maxValue);update();
}void GaugeWidget::setAlertLevels(double low, double medium, double high)
{m_lowAlert = low;m_mediumAlert = medium;m_highAlert = high;
}void GaugeWidget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);int side = qMin(width(), height());painter.setViewport((width() - side) / 2, (height() - side) / 2, side, side);painter.setWindow(-50, -50, 100, 100);// 绘制外圆painter.setPen(Qt::NoPen);QLinearGradient gradient(-40, -40, 40, 40);gradient.setColorAt(0, QColor(30, 30, 40));gradient.setColorAt(1, QColor(50, 50, 60));painter.setBrush(gradient);painter.drawEllipse(-40, -40, 80, 80);// 绘制刻度painter.save();painter.setPen(QPen(Qt::white, 0.5));for (int i = 0; i <= 10; ++i) {painter.drawLine(30, 0, 35, 0);painter.rotate(27);}painter.restore();// 绘制彩色弧QConicalGradient conicGradient(0, 0, -90);conicGradient.setColorAt(0.0, Qt::green);conicGradient.setColorAt(0.4, Qt::yellow);conicGradient.setColorAt(0.8, Qt::red);QPen arcPen;arcPen.setWidth(5);arcPen.setBrush(conicGradient);painter.setPen(arcPen);painter.drawArc(-30, -30, 60, 60, 30 * 16, 240 * 16);// 绘制指针 - 使用科技蓝色 (#3a7eff)QColor techBlue(58, 126, 255); // 科技蓝色painter.save();double valueRatio = (m_currentValue - m_minValue) / (m_maxValue - m_minValue);double angle = 30 + valueRatio * 240; // 从30度到270度painter.rotate(angle);painter.setPen(QPen(techBlue, 1));painter.setBrush(techBlue);QPointF points[3] = {QPointF(0, -5), QPointF(30, 0), QPointF(0, 5)};painter.drawPolygon(points, 3);painter.restore();// 绘制中心圆painter.setPen(Qt::NoPen);painter.setBrush(QColor(40, 40, 50));painter.drawEllipse(-10, -10, 20, 20);// 绘制文本 - 调小字体painter.setPen(Qt::white);QFont font = painter.font();font.setPointSize(4); // 调小字体painter.setFont(font);painter.drawText(-40, -45, 80, 20, Qt::AlignCenter, m_title);font.setPointSize(6); // 调小字体font.setBold(true);painter.setFont(font);painter.drawText(QRect(-20, -10, 40, 20), Qt::AlignCenter,QString::number(m_currentValue, 'f', 1));font.setPointSize(4); // 调小字体font.setBold(false);painter.setFont(font);painter.drawText(QRect(-20, 10, 40, 10), Qt::AlignCenter, m_unit);
}// DataCardWidget 实现
DataCardWidget::DataCardWidget(QWidget *parent, const QString &title,const QString &icon, const QString &unit): QWidget(parent), m_unit(unit)
{QVBoxLayout *layout = new QVBoxLayout(this);layout->setSpacing(5); // 减小间距QHBoxLayout *headerLayout = new QHBoxLayout();m_titleLabel = new QLabel(title);m_iconLabel = new QLabel(icon);QFont font = m_titleLabel->font();font.setPointSize(8); // 调小字体m_titleLabel->setFont(font);m_iconLabel->setFont(font);headerLayout->addWidget(m_iconLabel);headerLayout->addWidget(m_titleLabel);headerLayout->addStretch();m_valueLabel = new QLabel("0.0");font = m_valueLabel->font();font.setPointSize(12); // 调小字体font.setBold(true);m_valueLabel->setFont(font);m_valueLabel->setAlignment(Qt::AlignCenter);m_unitLabel = new QLabel(unit);m_unitLabel->setAlignment(Qt::AlignCenter);font.setPointSize(8); // 调小字体m_unitLabel->setFont(font);layout->addLayout(headerLayout);layout->addWidget(m_valueLabel);layout->addWidget(m_unitLabel);// 设置卡片样式setStyleSheet("DataCardWidget {""background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,""stop: 0 #2a2a3a, stop: 1 #1a1a2a);""border-radius: 8px;""padding: 8px;""}");m_titleLabel->setStyleSheet("color: #a0a0b0;");m_valueLabel->setStyleSheet("color: white;");m_unitLabel->setStyleSheet("color: #707090;");m_iconLabel->setStyleSheet("color: #3a7eff;"); // 使用科技蓝色
}void DataCardWidget::setValue(double value)
{m_valueLabel->setText(QString::number(value, 'f', 1));
}// MainWindow 实现
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{// 设置窗口属性setWindowTitle("环境监测中心");resize(900, 600); // 稍微调小窗口尺寸// 创建中央部件和主布局m_centralWidget = new QWidget(this);m_mainLayout = new QVBoxLayout(m_centralWidget);m_mainLayout->setSpacing(15); // 减小间距m_mainLayout->setContentsMargins(15, 15, 15, 15);// 设置背景m_centralWidget->setStyleSheet("background-color: #121218;");setCentralWidget(m_centralWidget);setupUI();setupSignals();// 启动定时器m_dataTimer = new QTimer(this);connect(m_dataTimer, &QTimer::timeout, this, &MainWindow::updateData);m_dataTimer->start(2000);m_clockTimer = new QTimer(this);connect(m_clockTimer, &QTimer::timeout, this, &MainWindow::updateTime);m_clockTimer->start(1000);// 初始化数据updateTime();updateData();
}MainWindow::~MainWindow()
{
}void MainWindow::setupUI()
{// 创建标题标签 - 调小字体m_titleLabel = new QLabel("环境监测中心");m_titleLabel->setAlignment(Qt::AlignCenter);m_titleLabel->setStyleSheet("QLabel {""color: #3a7eff;" // 使用科技蓝色"font-size: 22px;" // 调小字体"font-weight: bold;""margin: 8px;""}");// 创建时间标签 - 调小字体m_timeLabel = new QLabel();m_timeLabel->setAlignment(Qt::AlignCenter);m_timeLabel->setStyleSheet("QLabel {""color: #a0a0b0;""font-size: 12px;" // 调小字体"margin-bottom: 15px;""}");// 创建仪表盘布局m_gaugeLayout = new QHBoxLayout();m_gaugeLayout->setSpacing(25);// 创建温度仪表盘 - 使用科技蓝色QColor techBlue(58, 126, 255);m_temperatureGauge = new GaugeWidget(nullptr, "温度", -10, 50, "°C", techBlue);m_temperatureGauge->setAlertLevels(10, 25, 35);// 创建空气质量仪表盘 - 使用科技蓝色m_airQualityGauge = new GaugeWidget(nullptr, "PM2.5", 0, 300, "μg/m³", techBlue);m_airQualityGauge->setAlertLevels(35, 75, 150);// 创建空气质量标签 - 调小字体m_airQualityLabel = new QLabel("优");m_airQualityLabel->setAlignment(Qt::AlignCenter);m_airQualityLabel->setStyleSheet("QLabel {""color: #00ff00;""font-size: 14px;" // 调小字体"font-weight: bold;""background-color: #202830;""border-radius: 8px;""padding: 8px;""}");// 将仪表盘添加到布局m_gaugeLayout->addWidget(m_temperatureGauge);QVBoxLayout *airLayout = new QVBoxLayout();airLayout->setSpacing(10);airLayout->addWidget(m_airQualityGauge);airLayout->addWidget(m_airQualityLabel);m_gaugeLayout->addLayout(airLayout);// 创建数据卡片布局m_dataCardLayout = new QHBoxLayout();m_dataCardLayout->setSpacing(15);// 创建数据卡片m_humidityCard = new DataCardWidget(nullptr, "湿度", "💧", "%RH");m_lightCard = new DataCardWidget(nullptr, "光照", "☀️", "Lux");m_pressureCard = new DataCardWidget(nullptr, "气压", "🌪️", "hPa");// 将卡片添加到布局m_dataCardLayout->addWidget(m_humidityCard);m_dataCardLayout->addWidget(m_lightCard);m_dataCardLayout->addWidget(m_pressureCard);// 将所有部件添加到主布局m_mainLayout->addWidget(m_titleLabel);m_mainLayout->addWidget(m_timeLabel);m_mainLayout->addLayout(m_gaugeLayout);m_mainLayout->addLayout(m_dataCardLayout);m_mainLayout->addStretch();
}void MainWindow::setupSignals()
{// 连接信号和槽
}void MainWindow::updateData()
{// 生成模拟数据double temperature = 20.0 + QRandomGenerator::global()->bounded(15.0);double pm25 = QRandomGenerator::global()->bounded(150.0);double humidity = 30.0 + QRandomGenerator::global()->bounded(50.0);double light = QRandomGenerator::global()->bounded(1000.0);double pressure = 1000.0 + QRandomGenerator::global()->bounded(20.0);// 更新仪表盘m_temperatureGauge->setValue(temperature);m_airQualityGauge->setValue(pm25);// 更新空气质量标签QString airQuality;QString color;if (pm25 <= 35) {airQuality = "优";color = "#00ff00";} else if (pm25 <= 75) {airQuality = "良";color = "#ffff00";} else if (pm25 <= 115) {airQuality = "轻度污染";color = "#ff7f00";} else {airQuality = "污染";color = "#ff0000";}m_airQualityLabel->setText(airQuality);m_airQualityLabel->setStyleSheet(QString("QLabel {""color: %1;""font-size: 14px;""font-weight: bold;""background-color: #202830;""border-radius: 8px;""padding: 8px;""}").arg(color));// 更新数据卡片m_humidityCard->setValue(humidity);m_lightCard->setValue(light);m_pressureCard->setValue(pressure);
}void MainWindow::updateTime()
{QDateTime current = QDateTime::currentDateTime();m_timeLabel->setText(current.toString("yyyy-MM-dd hh:mm:ss"));
}

四、显示效果

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

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

相关文章

ARMv8架构01 - ARM64架构寄存器基础

一 、ARM64架构基础 1 ARMv8 A 架构介绍 ARMv8 - A是ARM公司发布的第一代支持64位处理器的指令集和架构。它在扩充64位寄存器的同时提供对上一代架构指令集的兼容&#xff0c;因而能同时提供运行 32位 和 64位应用程序的执行环境。 超大物理地址空间&#xff08;large Physical…

flutter专栏--深入剖析你的第一个flutter应用

使用fvm管理flutter版本 如果你有使用多版本flutter的需求&#xff0c;那么fvm将会给你提供较大的帮助。下面我列举一下mac flutter3.35.2的版本的操作命令&#xff0c;完成之后&#xff0c;你将可以随意切换flutter版本 # 下载fvm相关的依赖 brew tap leoafarias/fvm brew …

MongoDB 聚合查询超时:索引优化与分片策略的踩坑记录

人们眼中的天才之所以卓越非凡&#xff0c;并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代码是逻辑的诗篇&#xff…

Augmentcode免费额度AI开发WordPress商城实战

Augment AI开发WordPress商城实战&#xff1a;从零构建到免费额度续杯完整指南 前言 在AI编程工具日益普及的今天&#xff0c;如何高效利用这些工具来开发实际项目成为了开发者关注的焦点。本文将详细介绍如何使用Augment AI从零开始构建一个功能完整的WordPress商城系统&#…

【C++八股文】数据结构篇

一、单例模式优化实现 原代码问题分析 ​内存序重排序风险​&#xff1a;双重检查锁在C中可能因指令重排导致半初始化对象被访问​锁粒度过大​&#xff1a;每次获取实例都需要加锁&#xff0c;影响性能​线程安全性不足​&#xff1a;未考虑C11前的内存模型问题 改进方案&a…

并发编程——15 线程池ForkJoinPool实战及其工作原理分析

1 一道算法题引发的思考及其实现 1.1 算法题 问&#xff1a;如何充分利用多核 CPU 的性能&#xff0c;快速对一个2千万大小的数组进行排序&#xff1f; 这道题可以通过归并排序来解决&#xff1b; 1.2 什么是归并排序&#xff1f; 归并排序&#xff08;Merge Sort&#xff…

Kafka面试精讲 Day 6:Kafka日志存储结构与索引机制

【Kafka面试精讲 Day 6】Kafka日志存储结构与索引机制 在“Kafka面试精讲”系列的第6天&#xff0c;我们将深入剖析 Kafka的日志存储结构与索引机制。这是Kafka高性能、高吞吐量背后的核心设计之一&#xff0c;也是中高级面试中的高频考点。面试官常通过这个问题考察候选人是否…

Linux 字符设备驱动框架学习记录(三)

Linux字符设备驱动开发新框架详解 一、新旧驱动框架对比 传统字符设备驱动流程 手动分配设备号 (register_chrdev_region)实现file_operations结构体使用mknod手动创建设备节点 新式驱动框架优势 自动设备号分配&#xff1a;动态申请避免冲突自动节点创建&#xff1a;通过class…

《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(1)

目 录 摘 要 一、研究背景与目的 1.1 介绍拒绝服务&#xff08;DoS&#xff09;和分布式拒绝服务&#xff08;DDoS&#xff09;攻击的背景 &#xff08;1&#xff09;拒绝服务攻击&#xff08;DoS&#xff09;  &#xff08;2&#xff09;分布式拒绝服务攻击&#xff0…

深度学习篇---模型组成部分

模型组成部分&#xff1a;在 PyTorch 框架下进行图像分类任务时&#xff0c;深度学习代码通常由几个核心部分组成。这些部分中有些可以在不同网络间复用&#xff0c;有些则需要根据具体任务或网络结构进行修改。下面我将用通俗易懂的方式介绍这些组成部分&#xff1a;1. 数据准…

关于ANDROUD APPIUM安装细则

1&#xff0c;可以先参考一下连接 PythonAppium自动化完整教程_appium python教程-CSDN博客 2&#xff0c;appium 需要对应的版本的node&#xff0c;可以用nvm对node 进行版本隔离 3&#xff0c;对应需要安装android stuido 和对应的sdk &#xff0c;按照以上连接进行下载安…

八、算法设计与分析

1 算法设计与分析的基本概念 1.1 算法 定义 &#xff1a;算法是对特定问题求解步骤的一种描述&#xff0c;是有限指令序列&#xff0c;每条指令表示一个或多个操作。特性 &#xff1a; 有穷性&#xff1a;算法需在有限步骤和时间内结束。确定性&#xff1a;指令无歧义&#xff…

机器学习从入门到精通 - 神经网络入门:从感知机到反向传播数学揭秘

机器学习从入门到精通 - 神经网络入门&#xff1a;从感知机到反向传播数学揭秘开场白&#xff1a;点燃你的好奇心 各位&#xff0c;有没有觉得那些能识图、懂人话、下棋碾压人类的AI特别酷&#xff1f;它们的"大脑"核心&#xff0c;很多时候就是神经网络&#xff01;…

神经网络模型介绍

如果你用过人脸识别解锁手机、刷到过精准推送的短视频&#xff0c;或是体验过 AI 聊天机器人&#xff0c;那么你已经在和神经网络打交道了。作为深度学习的核心技术&#xff0c;神经网络模仿人脑的信息处理方式&#xff0c;让机器拥有了 “学习” 的能力。一、什么是神经网络&a…

苹果开发中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑?优雅草卓伊凡

苹果开发中什么是Storyboard&#xff1f;object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑&#xff1f;优雅草卓伊凡引言由于最近有个客户咨询关于 苹果内购 in-purchase 的问题做了付费咨询处理&#xff0c;得到问题&#xff1a;“昨天试着把您的那几部分code 组装成…

孩子玩手机都近视了,怎样限制小孩的手机使用时长?

最近两周&#xff0c;我给孩子检查作业时发现娃总是把眼睛眯成一条缝&#xff0c;而且每隔几分钟就会用手背揉眼睛&#xff0c;有时候揉得眼圈都红了。有一次默写单词&#xff0c;他把 “太阳” 写成了 “大阳”&#xff0c;我给他指出来&#xff0c;他却盯着本子说 “没有错”…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(六)

第五章 案例三:GoEHRStream - 实时电子病历数据流处理系统 5.1 案例背景与需求分析 5.1.1 电子病历数据流处理概述 电子健康记录(Electronic Health Record, EHR)系统是现代医疗信息化的核心,存储了患者从出生到死亡的完整健康信息,包括 demographics、诊断、用药、手术、…

GEM5学习(2):运行x86Demo示例

创建脚本 配置脚本内容参考官网的说明gem5: Creating a simple configuration script 首先根据官方说明创建脚本文件 mkdir configs/tutorial/part1/ touch configs/tutorial/part1/simple.py simple.py 中的内容如下&#xff1a; from gem5.prebuilt.demo.x86_demo_board…

通过 FinalShell 访问服务器并运行 GUI 程序,提示 “Cannot connect to X server“ 的解决方法

FinalShell 是一个 SSH 客户端&#xff0c;默认情况下 不支持 X11 图形转发&#xff08;不像 ssh -X 或 ssh -Y&#xff09;&#xff0c;所以直接运行 GUI 程序&#xff08;如 Qt、GNOME、Matplotlib 等&#xff09;会报错&#xff1a; Error: Cant open display: Failed to c…

1.人工智能——概述

应用领域 替代低端劳动&#xff0c;解决危险、高体力精力损耗领域 什么是智能制造&#xff1f;数字孪生&#xff1f;边缘计算&#xff1f; 边缘计算 是 数字孪生 的 “感官和神经末梢”&#xff0c;负责采集本地实时数据和即时反应。琐碎数据不上传总服务器&#xff0c;实时进行…