開源 C++ QT Widget 開發(十二)圖表--環境監測表盤

??文章的目的為了記錄使用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/m3", 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;實時進行…