嵌入式养成计划-43----QT QMainWindow中常用类的使用--ui界面文件--资源文件的添加--信号与槽

news2025/1/16 5:39:56

一百零九、QMainWindow中常用类的使用

109.1 菜单栏 QMenuBar

  • 菜单栏 QMenuBar 最多只能有一个

109.2 工具栏 QToolBar

  • 工具栏 QToolBar 可以有多个

109.3 状态栏QStatusBar

  • 状态栏 QStatusBar 最多只能有一个

109.4 浮动窗口QDockWidget

  • 浮动窗口 可以有多个

109.5 代码示例

  • main.cpp
#include "my_mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    my_MainWindow w;
    w.show();
    return a.exec();
}
  • my_mainwindow.h
#ifndef MY_MAINWINDOW_H
#define MY_MAINWINDOW_H

#include <QMainWindow>
#include <QMenuBar>     //  菜单栏的类
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>  //  浮动窗口类   铆接部件
#include <QTextEdit>    //  文本编辑类

class my_MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    my_MainWindow(QWidget *parent = nullptr);
    ~my_MainWindow();
};
#endif // MY_MAINWINDOW_H
  • my_mainwindow.cpp
#include "my_mainwindow.h"

my_MainWindow::my_MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 调整窗口大小
    this->resize(600,400);

    // 创建菜单栏    QMenuBar    最多只能有一个
    QMenuBar *mbar = menuBar();
    // 把菜单栏放到当前窗口中
    this->setMenuBar(mbar);

    // 往菜单栏中增加菜单
    QMenu *file = mbar->addMenu("文件");
    // mbar->setStyleSheet("background-color:black");
    QMenu *edit = mbar->addMenu("编辑");

    // 往 "文件" 菜单中增加菜单项
    file->addAction("新建");
    // 增加分隔符
    file->addSeparator();
    // 往菜单中增加菜单项
    file->addAction("打开");

    // 创建工具栏 QToolBar 可以有多个
    QToolBar *tbar = new QToolBar(this);
    // 把工具栏放到窗口中
    this->addToolBar(Qt::LeftToolBarArea,tbar);
    // 后期设置  只允许停靠范围  左边 或 右边  可以继续或
    tbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    // 设置不允许浮动
    tbar->setFloatable(false);

    // 往工具栏中增加工具项   文本
    tbar->addAction("锤子");
    // 往工具栏中增加工具项   按钮
    QPushButton *btn = new QPushButton("榔头",this);
    tbar->addWidget(btn);

    // 创建状态栏 QStatusBar 最多只能有一个
    QStatusBar *sbar = statusBar();
    // 把状态栏放到窗口中
    this->setStatusBar(sbar);

    // 在状态栏中增加标签
    QLabel *lab = new QLabel("标签",this);
    // 往状态栏中增加标签组件
    // 默认在左边
//    sbar->addWidget(lab);
    // 默认在右边
    sbar->addPermanentWidget(lab);

    // 创建浮动窗口 QDockWidget 可以有多个
    QDockWidget *dock = new QDockWidget("浮动窗口",this);
    // 把浮动窗口放到窗口中
    this->addDockWidget(Qt::TopDockWidgetArea, dock);
    // 设置浮动窗口的停靠范围
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

    // 中心部件 最多只能有一个
    QTextEdit *text = new QTextEdit(this);
    // 将中心部件放到窗口中
    this->setCentralWidget(text);

}

my_MainWindow::~my_MainWindow()
{
}
  • 运行结果
    在这里插入图片描述

一百一十、ui界面文件

  • ui界面文件在项目工程文件的Forms文件夹下,
  • 可以通过ui指针访问到ui界面上的所有组件(控件)。
  • 创建时需要选中 ui 的界面

ui 操作界面
在这里插入图片描述

一百一十一、资源文件的添加

  • 添加资源文件后,需要用到文件就可以不再用绝对路径了
  • 方便把整个项目打包,这样别人打开
  1. 把资源文件放入到该项目工程文件中,选中项目中任意一个文件,右击,在explorer中显示,将资源文件复制到该项目下。
  2. 添加资源文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 选中文件夹中的所有文件
    在这里插入图片描述
  4. 最后 Ctrl+B 或者左下角的锤子,构建一下

一百一十二、信号与槽

  1. 信号和槽是qt引以为傲的核心机制之一,可以实现多个组件之间的相互通信
  2. 信号:信号函数,定义在类体的signals权限下,信号函数不是一个完整的函数,只有声明,没有定义。
  3. 槽:槽函数,定义在类体的slots权限下,槽函数是一个完整的函数,既有声明,又有定义,也可以当成普通函数调用。
  4. 任何组件都有系统提供的默认信号函数和槽函数。

112.1 包含信号函数和槽函数的类体定义

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT //有关信号和槽的宏

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    
signals:     //表示该权限下都是信号函数
    void my_signal();  //自定义一个信号函数
    
public slots:  //表示该权限下是公共的槽函数
    void my_slot();  //自定义一个槽函数
    
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

112.2 信号和槽的连接方式

  • 基于ui界面上的连接,在ui界面下面的信号与槽区,进行信号与槽的连接,该连接只适用于系统提供的信号和槽
    不需要手动书写信号函数,槽函数,连接函数。
    在这里插入图片描述

  • 基于ui界面上的连接,在组件上,右击–>转到槽,选中要发射的信号,需要程序员在槽函数中写逻辑代码,但也不需要写连接函数。
    在这里插入图片描述

    //按钮2对应的槽函数
    void Widget::on_Btn2_clicked()
    {
        //让按钮1变色
        //ui->Btn1->setStyleSheet("background-color:red");
        static int num = 0;
        if(num%3 == 0)
        {
            ui->Btn1->setStyleSheet("background-color:red");
        }
        else if (num%3 == 1)
        {
            ui->Btn1->setStyleSheet("background-color:green");
        }
        else if (num%3 == 2)
        {
            ui->Btn1->setStyleSheet("background-color:blue");
        }
        ++num;
    }
    
  • 手动连接信号和槽函数,基于qt4版本,该连接是不友好的连接

    [static] QMetaObject::Connection  //返回值类型  是一个静态成员函数,实现信号和槽的连接
        QObject::connect(            //函数名
        const QObject *sender,       //信号的发送者,是一个组件的指针
        const char *signal,          //发送具体的信号(信号函数),使用const char* ,而函数名使用函数指针来接收,需要用SIGNAL()转换
        const QObject *receiver,     //信号的接受者,是一个组件的指针
        const char *method, )       //对信号处理的槽,使用const char* ,而函数名使用函数指针来接收,需要用SLOT()转换
        
    举个例子:
    
      QLabel *label = new QLabel;
      QScrollBar *scrollBar = new QScrollBar;
      QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                       label,  SLOT(setNum(int)));
    
  • 手动连接信号和槽函数,基于qt5版本,该连接是友好的连接

    [static] QMetaObject::Connection  //返回值类型  是一个静态成员函数,实现信号和槽的连接
        QObject::connect(        //函数名
            const QObject *sender,  //信号的发送者,是一个组件的指针
            PointerToMemberFunction signal, //信号函数,是一个函数指针,所以放函数名即可
            const QObject *receiver,     //信号的接受者,是一个组件的指针
            PointerToMemberFunction method, ) //槽函数,是一个函数指针,所以放函数名即可
            
    举个例子:
      QLabel *label = new QLabel;
      QLineEdit *lineEdit = new QLineEdit;
      QObject::connect(lineEdit, &QLineEdit::textChanged,  label,  &QLabel::setText);
    
  • 手动连接信号和功能函数,只要组件发射了信号,就自动调用功能函数的内容。
    功能函数可以是 全局函数,也可以是 lambda表达式

    [static] QMetaObject::Connection  //函数返回值类型
        QObject::connect(      //函数名
            const QObject *sender,  //信号的发送者
            PointerToMemberFunction signal,  //信号函数
            Functor functor)   //功能函数
    

    1.全局函数举个例子:

    void someFunction();
    QPushButton *button = new QPushButton;
    QObject::connect(button, &QPushButton::clicked, someFunction);
    

    2.lambda表达式

    QByteArray page = ...;
    QTcpSocket *socket = new QTcpSocket;
    socket->connectToHost("qt-project.org", 80);
    QObject::connect(socket, &QTcpSocket::connected, [=] () {
          socket->write("GET " + page + "\r\n");
    });
    

112.3 定义语音播报

  • 在工程文件中增加这个 :texttospeech
    在这里插入图片描述
    头文件
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include<QPushButton>
    #include<QTextToSpeech> //语音播报类
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT //有关信号和槽的宏
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    signals:     //表示该权限下都是信号函数
        void my_signal();  //自定义一个信号函数
    public slots:  //表示该权限下是公共的槽函数
        void my_slot();  //自定义一个槽函数
        void Btn4_slot();  //btn4对应的槽函数声明
    private slots:
        void on_Btn2_clicked(); //系统定义的槽函数声明
    private:
        Ui::Widget *ui;
        
        QPushButton *btn3;
        //定义一个语音播报者
        QTextToSpeech *speecher;
    };
    #endif // WIDGET_H
    
    源文件
    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        //给语音播报者实例一个空间
        speecher = new QTextToSpeech(this);
    
        //实例化一个按钮
        btn3 = new QPushButton("按钮3",this);
        btn3->move(ui->Btn2->x(), ui->Btn2->y()+ui->Btn2->height()+10);
        btn3->resize(ui->Btn2->width(),ui->Btn2->height());
    
        //手动连接信号和系统槽,基于qt4版本  是不友好的连接
        //函数原型:[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
        //参数1:是一个组件的指针 信号的发送者
        //参数2:信号函数,需要宏函数转换
        //参数3:是一个组件的指针 信号的接受者
        //参数4:槽函数,需要宏函数转换
        //connect(btn3, SIGNAL(clicked()), this, SLOT(close()));
    
        //手动连接信号和系统槽,基于qt4版本  是不友好的连接
        this->connect(btn3, SIGNAL(clicked()), this,SLOT(my_slot()));
    
        //手动连接信号和自定义槽,基于qt5版本  是友好的连接
        //函数原型:[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
        //参数1:是一个组件的指针 信号的发送者
        connect(ui->Btn4, &QPushButton::clicked, this, &Widget::Btn4_slot);
    }
    Widget::~Widget()
    {
        delete ui;
    }
    //自定义槽函数的实现
    void Widget::my_slot()
    {
        this->close();
    }
    //按钮4对应的槽函数实现    #include<QTextToSpeech> //语音播报类
    void Widget::Btn4_slot()
    {
        //this->close();
        static int num = 0;
        if(num%3 == 0)
        {
            speecher->say("咳咳咳");
        }
        else if (num%3 == 1)
        {
            speecher->say(ui->Btn2->text());
        }
        else if (num%3 == 2)
        {
            speecher->say(this->btn3->text());
        }
        ++num;
    }
    //按钮2对应的槽函数
    void Widget::on_Btn2_clicked()
    {
        //让按钮1变色
        //ui->Btn1->setStyleSheet("background-color:red");
        static int num = 0;
        if(num%3 == 0)
        {
            ui->Btn1->setStyleSheet("background-color:red");
        }
        else if (num%3 == 1)
        {
            ui->Btn1->setStyleSheet("background-color:green");
        }
        else if (num%3 == 2)
        {
            ui->Btn1->setStyleSheet("background-color:blue");
        }
        ++num;
    }
    

112.4 自定义信号

  1. 自定义信号,写在类体的signals权限下,无返回值类型,只有声明,没有定义
  2. 自定义信号,需要用emit关键字触发,一旦被触发,就会执行与该信号连接的槽函数

112.5 信号与槽的断开连接

  • 断开信号与槽的连接,只需要讲上述的连接函数改成disconnect即可,其函数参数和连接函数一致。
    在这里插入图片描述

小作业

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,
在自定义的槽函数中调用关闭函数

将登录按钮使用qt5版本的连接到自定义的槽函数中,
在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",
如果账号密码匹配成功,则输出“登录成功”,并关闭该界面,
如果匹配失败,则输出登录失败,并将密码框中的内容清空

我写的

login.h

#ifndef LOGIN_H
#define LOGIN_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include <QString>

QT_BEGIN_NAMESPACE
namespace Ui { class Login; }
QT_END_NAMESPACE

class Login : public QWidget
{
    Q_OBJECT

public:
    Login(QWidget *parent = nullptr);
    ~Login();

signals:
    void clicked_cencel_signal();

public slots:
    void close_window_slot();

private:
    Ui::Login *ui;
};
#endif // LOGIN_H

login.cpp

#include "login.h"
#include "ui_login.h"

Login::Login(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Login)
{
    ui->setupUi(this);
    //  上半部分的图画
    ui->loginLab->setPixmap(QPixmap(":/pictrue/qq_login.gif"));
    //  设置上半部分图画为自适应大小
    ui->loginLab->setScaledContents(true);

    //  设置窗口左上角的企鹅和QQ
    this->setWindowTitle("QQ");
    this->setWindowIcon(QIcon(":/pictrue/qie.png"));

    //  设置输入框前面的企鹅和密码图片
    ui->unameLab->setPixmap(QPixmap(":/pictrue/qie.png"));
    ui->passwdLab->setPixmap(QPixmap(":/pictrue/passwd.jpg"));
    //  设置密码输入形式
    ui->passwdEdit->setEchoMode(QLineEdit::Password);
    //  设置头像
    ui->touxiang->setPixmap(QPixmap(":/pictrue/touxiang.ico"));
    //  设置右下角的二维码
    ui->ewm->setPixmap(QPixmap(":/pictrue/eweima.png"));

    //  用 QT4 的方式连接自定义的槽函数,用于让 取消按钮 去 关闭窗口
    connect(ui->cencelBtn, SIGNAL(clicked()), this, SLOT(close_window_slot()));

    //  用 QT5 的方式 让登录按钮 连接自定义的槽函数
    connect(ui->loginBtn,&QPushButton::clicked,[&](){
        if(ui->unameEdit->text() == "admin" || ui->passwdEdit->text() == "123456"){
            qDebug() << "登录成功";
            close_window_slot();
        }
        else
        {
            ui->passwdEdit->clear();
        }
    });

}

Login::~Login()
{
    delete ui;
}

void Login::close_window_slot()
{
    this->close();
}

main.cpp

#include "login.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Login w;
    w.show();
    return a.exec();
}

效果图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医疗图像分割实践NNUnet-V2 基于window10+3090配置。官方数据Task_02

Window10 配置NNUnet完成官方任务分割 NNUnet论文介绍 nnUnet是一个针对医学图像分割提出得一个即开即用的框架&#xff0c;用户只需要按照官方给出的数据要求进行格式转换便可以进行快速的医学图像分割的训练和推演。其更新的V2版本代码变得更加易读和方便使用&#xff0c;并…

GitLab使用webhook触发Jenkins自动构建

1、jenkins安装gitlab插件 在插件管理中&#xff0c;搜索gitlab安装这个插件。 2、job中配置webhook地址和密钥 进入job设置&#xff0c;构建触发器中就可以看到gitlab的webhook配置&#xff0c;复制URL地址和随机令牌至gitlab中 勾选后&#xff0c;就可以展开设置&#xff…

Go语言入门心法(十):Go语言操作MYSQL(CRUD)

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(八): mysql驱动安装报错onnection failed Go语言入门心法(…

黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法

你的任务是模拟黑白棋游戏的进程。黑白棋的规则为&#xff1a;黑白双方轮流放棋子&#xff0c;每次必须让新放的棋子“夹住”至少一枚对方棋子&#xff0c;然后把所有被新放棋子“夹住”的对方棋子替换成己方棋子。一段连续&#xff08;横、竖或者斜向&#xff09;的同色棋子被…

【黑马程序员】MySQL学习记录二(SQL)案例

案例1&#xff08;数据类型、DDL、DML、DQL&#xff09; 根据需求创建表&#xff08;设计合理的数据类型、长度&#xff09; 1、设计一张员工信息表&#xff0c;要求如下 create table emp( id INT COMMENT 编号, workno VARCHAR(10) COMMENT 员工工号, name VARCHAR(10) COM…

企业工厂车间台式电脑经常有静电导致开不开机,如何彻底解决?

环境: HP 480G7 Win10 专业版 问题描述: 企业工厂车间台式电脑经常有静电导致开不开机,如何彻底解决? 开机电源指示灯闪,显示器黑屏没有画面开不了机,一般是把主机电源断了,把主机盖打开 把内存条拔了之后长按开机按键10秒以上然后插上内存条开机正常 相对与有些岗…

智慧应急三维电子沙盘系统

1 概述 深圳易图讯科技有限公司&#xff08;www.3dgis.top&#xff09;采用大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;以6博硕团队为核心&#xff0c;研发了智慧应急三维电子沙盘系统&#xff0c;成功案例100。该系统支持高清卫星影像、DEM高程数据、…

vue-pdf多页预览异常,Rendering cancelled, page 1 Error at BaseExceptionClosure xxx

项目开发使用vue-pdf,单页情况预览正常&#xff0c;多页vue-pdf预览异常&#xff0c;第一次预览时&#xff0c;会先弹出异常模态窗口&#xff0c;关闭模态窗口&#xff0c;pdf又是正常显示&#xff0c;报错信息及异常截图如下&#xff1a; 报错信息 Rendering cancelled, page…

使用Vue组件的watch监听-简单计算器

Vue组件的初探 一、浅析 这里做了一个全局的组件vue.component(mycomp,{}) 在<template></template>中写组件&#xff0c;将idcomp1 script中直接template:"#copm1" 其他的部分就是之前所讲的watch来实现简易计算器差不多 <div id"app"&…

6.5 Elasticsearch(五)Spring Data Elasticsearch - 增删改查API

文章目录 1.Spring Data Elasticsearch2.案例准备2.1 在 Elasticsearch 中创建 students 索引2.2 案例测试说明 3.创建项目3.1 新建工程3.2 新建 springboot module&#xff0c;添加 spring data elasticsearch 依赖3.3 pom.xml 文件3.4 application.yml 配置 4.Student 实体类…

SD卡与emmc的异同

eMMC与SD卡的异同&#xff1a; 物理尺寸和接口&#xff1a; eMMC&#xff1a;eMMC是一种嵌入式存储解决方案&#xff0c;通常采用BGA&#xff08;Ball Grid Array&#xff09;封装&#xff0c;焊接在电路板上。它没有标准的物理尺寸&#xff0c;而是以芯片的形式存在。SD卡&…

代理模式(初学)

代理模式 一、什么是代理模式 代理模式&#xff1a;为其他对象提供一种代理以控制对这个对象的访问 二、简单例子 这里面的骏骏就起到了代理的身份&#xff0c;而贵贵则是被代理的身份。 三、代码实现 1、用一个接口&#xff08;GivingGifts&#xff09;来保存送礼物的动作…

链表的概念+MySingleList的实现

文章目录 链表一、 链表的概念1.概念2. 结构 二、MySingleList的实现1 .定义内部类2 .创建链表3. 遍历链表并打印4.查找单链表中是否包含关键字key5.得到链表的长度6.头插法7. 尾插法8.任意位置插入8.删除结点清空 链表 顺序存储&#xff1a;顺序表/ArrayList 优点&#xff1…

Android平台GB28181设备接入模块之SmartGBD

大牛直播SDK研发的Android平台GB28181设备接入SDK&#xff08;SmartGBD&#xff09;&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0c;可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育…

C#插入排序算法

插入排序实现原理 插入排序算法是一种简单、直观的排序算法&#xff0c;其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤如下 首先咱们假设数组长度为n&#xff0c;从第二个元素开始&#xff0c;将当前元素存储在临时变量temp中。 从当前元素的前一…

【量化交易笔记】9.量化投资理论及一般流程

前言 在第7篇文章中指出&#xff0c;量化交易的主要有两方面应用&#xff0c;基于的数据主要是两个类型&#xff0c;如前面讲的用之前的数据预测股价&#xff0c;这类数据我们可归为纵向研究数据&#xff0c;又称时间序列数据&#xff0c;另一类是横截面数据&#xff0c;以称截…

CleanMyMac X2024免费版苹果电脑杀毒工具

在过去&#xff0c;人们普遍认为苹果电脑不容易受到恶意软件的攻击&#xff0c;因此不需要安装杀毒软件。然而&#xff0c;随着苹果电脑的普及和互联网的发展&#xff0c;苹果电脑也逐渐成为黑客和恶意软件的目标。为了保护苹果电脑的安全&#xff0c;使用一款可靠的苹果电脑杀…

通过SPI传输BMI160数据到nrf528xx

目录 主控和外设之间的联系关键示例可能的bug 主控和外设之间的联系 在完成代码之前&#xff0c;我们手里会有两份代码&#xff0c;一份是nrf528xx的SDK&#xff0c;一份是BMI160传感器的SDK&#xff0c;怎么利用SDK完成我们的需求呢&#xff1f;首先我们要搞明白&#xff0c;…

了解工业交换机背板带宽及其重要性

工业交换机是工业自动化领域中的关键设备&#xff0c;用于管理和控制工业网络中的数据流量。在设计和维护工业网络时&#xff0c;了解和优化工业交换机的性能至关重要。其中&#xff0c;背板带宽是一个重要的性能参数。 什么是工业交换机的背板带宽&#xff1f; 工业交换机的背…

Ubuntu系统如何进行网络连接-连接电脑局域网-物联网开发-Ubuntu系统维护

一、前言 在Ubuntu系统的维护中&#xff0c;我们常常需要对VMware中的Ubuntu虚拟机配置网络连接&#xff0c;以连接服务器下载或安装软件包以及进行网络通信等。 基于上述问题&#xff0c;本文将着重分享Ubuntu配置网络链接的若干方法。 二、网络连接模式 打开VM&#xff0c;右…