Qt基础 | Qt Creator的基本介绍与使用 | 在Visual Studio中创建Qt项目

文章目录

  • 一、Qt Creator的基本介绍与使用
    • 1.新建一个项目
    • 2.项目的文件组成
    • 3.项目文件介绍
      • 3.1 项目管理文件
      • 3.2 界面文件
      • 3.3 主函数文件
      • 3.4 窗体相关的文件
    • 4.项目的编译、调试与运行
  • 二、在Visual Studio中创建Qt项目


  • Qt C++开发环境的安装,请参考https://liujie.blog.csdn.net/article/details/139798429

一、Qt Creator的基本介绍与使用

1.新建一个项目

  以新建一个项目为例,初步了解 Creator 设计应用程序的基本过程。

  点击“创建项目”,

image-20240711191729230

  出现如下对话框,在这个对话框 选择需要创建的项目或文件的模板。

image-20240711191823609

Qt Creator 可以创建多种项目, 在最左侧的列表框中 单击 “Application”, 中间的列表框中列出了可以创建的应用程序的模板,各类应用程序如下:

  • Qt Widgets Application, 支持桌面平台的有图形用户界面的应用程序。 GUI 的设计完全基于 C++语言,采用 Qt 提供的 C++类库。

  • Qt Console Application, 控制台应用程序,无 GUI 界面

  • Qt Quick Application ,创建一个Qt Quick应用程序,它可以同时使用QML和C++代码。Qt Quick是Qt 支持的一套GUI 开发架构,其界面设计采用 QML 语言,程序架构采用 C++语言。利用 Qt Quick 可以设计非常炫的用户界面,一般用于移动设备或嵌入式设备上无边框的应用程序的设计。

  • Qt Quick Application(compat),创建一个包含空白窗口的Qt Quick应用程序。

    如果你想使用除CMake以外的其他构建系统,或者使用低于6.0版本的Qt,请使用这个“兼容”版本。

  选择项目类型为 “Qt Widgets Application” 后,单击 “选择”按钮,出现新建项目向导。

  • 设置项目名称和保存路径

    image-20240712134211117

  • 选择“qmake”构建系统

    image-20240711193223011

  • 选择需要创建界面的基类 (base class)

    image-20240711193329688

    有3种基类可以选择:

    • QMainWindow 是主窗口类,主窗口具有主菜单栏、工具栏和状态栏,类似于一般的应用

      程序的主窗口

    • QWidget 是所有具有可视界面类的基类,选择 QWidget 创建的界面对各种界面组件都可以支持;

    • QDialog 是对话框类,可建立一个基于对话框的界面

  • 选择 QWidget 作为基类,勾选 “Generate form” 复选框。这个选项如果勾选,就会由 Qt Creator 创建用户界面 (Use Interface, UI) 文件,否则,需要自己手写代码创建界面

  • 翻译文件设置如下:

    image-20240711193856265

  • 选择构建套件

    image-20240712134409084

  • 单击 "完成"按钮就可以完成项目的创建

    image-20240712134424149

2.项目的文件组成

  完成了以上新建项目的步骤后,可显示如下窗口

image-20240712134600846

窗口有上下两个子窗口, 上方的目录树显示了项目内文件的组织结构, 显示当前项 sampl。项目的名称构成目录树的一个根节点, Qt Creator 可以打开多个项目,但是只有一个活动项目,活动项目的项目名称节点用粗体字体表示。在项目名称节点下,项目文件组成包含以下文件:

  • 项目组织文件 samp2_ 1.pro :存储项目设置的文件

  • widget.h 是所设计的窗体类的头文件

  • widget.cpp是widget.h里定义类的实现文件。

    在C++里,任何窗体或界面组件都是用类封装的,一个类一般有一个头文件和一个源程序文件

  • 窗体界面文件 widget.ui: 一个XML 格式存储的窗体上的元件及其布局的文件

  • 主程序入口文件 main.cpp:实现 main() 函数的程序文件

  左侧上下两个子窗口的显示内容可以通过其上方的一个下拉列表框进行选择,可以选择的显示内容包括 Projects、 Open Documents、 Bookmarks、 File System、 Class View、 Outline 等。

image-20240711195541529

3.项目文件介绍

3.1 项目管理文件

  后缀为.pro 的文件是项目的管理文件,文件名就是项目的名称 ,项目管理文件用于记录项目的一些设置,以及项目包含文件的组织管理。如:项目中的 samp2_ 1.pro,其内容如下:

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17
TARGET = samp2_1
TEMPLATE = app
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

samp2_ 1.pro文件解析:

  • QT += core gui

    表示项目中加入core gui 模块。core gui是Qt 用于 GUI 设计的类库模块。如果创建的是控制台(Console) 应用程序,就不需要添加core gui。

  • greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

    这是个条件执行语句,表示当 Qt 主版本大于4时,才加入 widgets 模块。

  • CONFIG += c++17

    表示将 C++17 标准添加到项目的配置中,需要编译器支持 C++17 标准

  • TARGET = samp2_1

    表示生成的目标可执行文件的名称,即编译后生成的可执行文件是samp2_1.exe

  • TEMPLATE = app

    表示项目使用的模板是 app, 是一般的应用程序。

  • SOURCES、HEADERS、FORMS

    记录了项目中包含的源程序文件、头文件和窗体文件的名称

    这些文件列表是Qt Creator自动添加到项目管理文件里面的,用户需要手动修改 。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。

3.2 界面文件

  后缀为 ".ui"的文件是可视化设计的窗体的定义文件 ,如widget.ui 。双击项目文件目录树中的文件widget.ui,会打开Qt Creator中的Qt Designer对窗体进行可视化设计,如下所示

image-20240712141913610

UI设计器有以下功能区域:

  • 组件面板:

    窗口左侧是界面设计组件面板,分为多个组。界面设计的常见组件都可以在组件面板里找到

  • 中间主要区域是待设计的窗体

  • Signals和Slots编辑器与Action编辑器是位于待设计窗体下方的两个编辑器。

    • Signals和Slots编辑器用于可视化地进行信号与槽的关联
    • Action编辑器用于可视化设计Action
  • 布局和界面设计工具栏

    窗口上方的一个工具栏,工具栏上的按钮主要实现布局和界面设计。

    工具栏各按钮功能如下:

    image-20240712152529297

  • 对象浏览器 (Object Inspector)

    窗口右上方是 Object Inspector, 用树状视图显示窗体上各组件之间的布局包含关系,视图有两列,显示每个组件的对象名称(ObjectName) 和类名称。

  • 属性编辑器(Property Editor)

    窗口右下方是属性编辑器,是界面设计时最常用到的编辑器。属性编辑器显示某个选中的组件或窗体的各种属性及其取值,可以在属性编辑器里修改这些属性的值。

    属性又分为多个组,实际上表示了类的继承关系

    image-20240712143059061

    表示QLabel的继承关系是 QObject—>QWidget—>QFrame—>QLabel

3.3 主函数文件

  main.cpp 是实现 main() 函数的文件。main() 函数是应用程序的入口。它的主要功能是创建应用程序,创建窗口,显示窗口,并运行应用程序,开始应用程序的消息循环和事件处理。

其内容为

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);	//定义并创建应用程序Widget w;	//定义并创建窗口w.show();	//显示窗口return a.exec();	//应用程序运行
}

main()函数解析:

  • QApplication是Qt 的标准应用程序类
  • a.exec():启动应用程序的执行,开始应用程序的消息循环和事件处理。

3.4 窗体相关的文件

  将项目进行编译后,会自动生成一个文件ui_widget.h。各文件的功能如下:

文件功能
widget.h定义窗体类的头文件,定义了类Widget
widget.cppWidget类的功能实现文件
widget.ui窗体界面文件,由UI设计器自动生成,存储了窗体上各个组件的属性设置和布局
ui_widget.h编译后,根据窗体上的组件及其属性、信号与槽的关联等自动生成的一个类的定义文件

  下面分析各个文件的内容及其功能,以及是如何联系在一起工作,实现界面的创建与显示的。

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H
  • namespace声明

    namespace Ui {
    class Widget;
    }
    

    这是一个前向声明,它告诉编译器 Ui 命名空间中有一个名为 Widget 的类,但编译器此时不需要知道这个类的具体定义。头文件中的前向声明用于引用类而不需要包含整个类定义,而源文件中的包含则是为了实际使用类的定义。

    前向声明允许你在不包含完整类定义的情况下引用类。这可以减少编译时间,避免循环依赖,并使代码更加模块化。

  • 在Widget类中使用宏Q_OBJECT

    这是使用 信号与槽机制的类都必须加入的一个宏

  • Ui::Widget *ui;

    这个指针是用前面声明的 namespace Ui里的Widget 类定义的,所以指针 ui 是指向可视化设计的界面,后面访问界面上的组件,都需要通过这个指针ui

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;
}
  • #include "ui_widget.h"

    引入可视化界面类定义文件

  • 构造函数头部:Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)

    表示执行父类QWidget的构造函数,创建一个Ui::Widget类的对象ui

  • ui->setupUi(this);

    执行Ui::Widget类的setupUi()函数,这个函数实现窗口的生成与各种属性的设置、信号与槽的关联

widget.ui

  widget.ui 是窗体界面定义文件,是 XML 文件,定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。用UI设计器可视化设计的界面都由Qt自动解析,并以XML文件的形式保存下来。

ui_widget.h

  ui_widget.h是在对widget.ui文件编译后自动生成的一个文件。因此,对ui_widget.h文件手工进行修改没有任何意义。其内容为:

/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 5.15.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QLabel *LabDemo;QPushButton *btnClose;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(800, 600);LabDemo = new QLabel(Widget);LabDemo->setObjectName(QString::fromUtf8("LabDemo"));LabDemo->setGeometry(QRect(260, 190, 201, 42));QFont font;font.setPointSize(20);font.setBold(true);LabDemo->setFont(font);btnClose = new QPushButton(Widget);btnClose->setObjectName(QString::fromUtf8("btnClose"));btnClose->setGeometry(QRect(310, 350, 80, 28));retranslateUi(Widget);QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));LabDemo->setText(QCoreApplication::translate("Widget", "Hello,World", nullptr));btnClose->setText(QCoreApplication::translate("Widget", "Close", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

ui_widget.h文件主要做了以下工作:

  • 定义了一个类Ui_Widget,用于封装可视化设计界面

  • 自动生成了界面各组件的类成员变量定义。在public 部分为界面上每个组件定义了一个指针变量,变量的名称就是设置的objectName。

  • 定义了setupUi()函数,这个函数用于创建各个界面组件,并设置其位置、大小、 文字内容、字体等属性,设置信号与槽的关联。

  • 定义retranslateUi()函数,用来设置界面各组件的文字内容属性

  • 设置信号与槽的关联

    QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));
    //设置槽函数的关联方式
    QMetaObject::connectSlotsByName(Widget); 
    
    • 信号与槽关联是用QObject::connect() 函数实现的

      信号槽函数由5种写法,具体可参考:https://blog.csdn.net/zwcslj/article/details/139843133?spm=1001.2014.3001.5501

      信号与槽的使用规则:

      • 一个信号可以连接多个槽

        当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。

      • 多个信号可以连接同一个槽

      • 一个信号可以连接另外一个信号

      • 严格的情况下,信号与槽的参数个数和类型需要一致,至少信号参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。

      • 在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT

      • 当一个信号被发射时,与其关联的槽函数通常被立即执行。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

    • QMetaObject::connectSlotsByName(Widget);

      将搜索widget界面上的所有组件,将信号与槽函数匹配的信号和槽关联起来,它假设槽函数的名称为:

      void on <object_name>_<signal_name>(<signal parameters>);
      

      若槽函数的是书写符合要求,就不需要利用connect()函数来手动关联信号与槽,而是在可视化界面类的构造函数里调用 setupUi() 自动完成了关联。

4.项目的编译、调试与运行

  单击主窗口左侧工具栏上的“Projects”按钮 ,出现如下项目编译设置界面。

image-20240712135555035

  界面左侧一栏的 “Build & Run” 下面显示了本项目中可用的编译器工具,要使用哪一个编译器用于项目编译,单击其名称即可,选择的编译器名称会用粗体字表示。

  每个编译器又有Build和Run两个设置界面。在 Build 置界面上 ,有一个"Shadow build " 复选框。如果勾选此项, 编译后将在项目的同级目录下建立一个编译后的文件目录,目录名称包含编译器信息 ,这种方式一般用于使用不同编译器创建不同版本的可执行文件。

image-20240712135659285

如果不勾选此项,编译后将在项目的目录下建立 “Debug"和"Release” 子目录用于存放编译后的文件。

image-20240712135822513

  主窗口左侧工具栏下方有4个按钮,

image-20240711201231154

其功能为:

  • 第一个图标:弹出菜单选择编译工具和编译模式,如Debug或Release 模式

  • 第二个图标:直接运行程序,如果修改后未编译,会先进行编译。即使在程序中设置了断点,此方式运行的程序也无法调试。快捷键为Ctrl + R

  • 第三个图标:项目需要以 Debug 模式编译,点此按钮开始调试运行,可以在程序中设置断点。若是以 Release 模式编译,点此按钮也无法进行调试。快捷键为F5

    在工程开发中,一般会选择Visual Studio作为调试软件。

  • 第四个图标:编译当前项目

二、在Visual Studio中创建Qt项目

注意:创建VS新项目是在qt与vsaddin安装完成后,且Qt Versions配置完成后,具体参考:https://liujie.blog.csdn.net/article/details/139798429

  • 点击“创建新项目”

    image-20240618190434230

  • 所有语言中选择“C++”

    image-20240618190642019

  • 在搜索在输入“qt”,选择适当的qt模板,点击“下一步”

    image-20240618190750663

  • 配置新项目,配置自己的项目名称与位置,点击“创建”

    image-20240618191255720

  • 点击“Next”

    image-20240618192701520

  • 点击“Next”,创建项目

    image-20240618192907990

  • 选择Base class后,点击“Finsh”

    image-20240618193055235

    这里其实应该将Class Name设置为Vsdemo01(大写开头),并勾选“Lower case file names”

    image-20240618193120440

    image-20240618193216791

  • 点击“本地Windows调试器”即可进行编译调试

    image-20240618193425663

注意:在Visual Studio2019中双击打开xx.ui文件时,如果直接打开会报错

image-20240618193653259

因此,需要右击ui文件,重新设置打开方式

image-20240618193819280

点击“添加”,选择qt安装目录下的qtcreator来进行打开,路径如:D:\Qt\Tools\QtCreator\bin\qtcreator

image-20240618194051398

点击“确定”,并”设为默认值“

image-20240618194254872

image-20240618194342959

此时,xx.ui文件就可以在qtcreator中打开,不会报错。

image-20240618194500652

修改xx.ui文件后,要记得ctrl+s保存,然后再关掉qtcreator!

image-20240618194822185

此时,vs2019重新编译即可

image-20240618194940410

说明:项目创建完成!

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

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

相关文章

HTTP背后的故事:理解现代网络如何工作的关键(一)

一.HTTP是什么 概念 &#xff1a; 1.HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议。 2.HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 3.HTTP 往往是基于传输层的 TCP 协议实现的 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 T…

使用 HttpServlet 接收网页的 post/get 请求

前期工作&#xff1a;部署好 idea 和 一个 web 项目 idea(2021),tomcat(9) ->创建一个空的项目 -> 新建一个空的模块 -> 右键单击模块 选择 Add..Fra.. Sup.. -> 勾选Web App...后点击OK -> 点击 file - Project Struc... -> 选择刚刚的模块 -> 点…

Centos 使用nfs配置共享目录使docker集群所有容器日志统一主机访问

Centos 使用nfs配置共享目录&#xff0c;使docker集群所有容器日志统一存放在主机一个共享目录下&#xff0c;供开发人员访问查看 准备两台或以上Centos服务器 192.168.0.1 nfs服务器 192.168.0.2 nfs客户端 以root用户登录192.168.0.1服务器&#xff0c;执行以下操作 注意先…

vue里完成一个简单的评论功能,博客必备

效果展示 步骤 1-表单收集输入信息 <div class"commentorInfo"><div style"position: relative"><i class"fa fa-user"style"position:absolute;top: 50%;transform: translateY(-50%)translateX(8px)"></i>…

大语言模型诞生过程剖析

过程图如下 &#x1f4da; 第一步&#xff1a;海量文本的无监督学习 得到基座大模型&#x1f389; &#x1f50d; 原料&#xff1a;首先&#xff0c;我们需要海量的文本数据&#xff0c;这些数据可以来自互联网上的各种语料库&#xff0c;包括书籍、新闻、科学论文、社交媒体帖…

Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

文章目录 开放端口号问题引入依赖验证连接通用命令使用set 和 get 命令的使用exists 和 del 命令的使用keys 命令的使用expire 和 ttl 命令type 命令的使用 String 类型命令使用mset 和 mget 命令getrange 和 setrange 命令append 命令incr 和 decr 命令 list 类型命令使用lpus…

[极客大挑战 2019]FinalSQL

用异或来注入 注入语句为1是error&#xff0c;为0时为check ?id1^(length(database())5)写盲注脚本 这道题有点坑&#xff0c;首先是表名有两个&#xff0c;一个特别想flag&#xff0c;还有一个就是需要多线程&#xff0c;但是由于是python的&#xff0c;也没有那么必要等一…

CinemachineBrain的属性简介

CinemachineBrain的属性简介 CinemachineBrain是Unity Cinemachine的核心组件&#xff0c;它和Camera组件挂载在一起&#xff0c;监控场景中所有的virtual camera。CinemachineBrain在inspector中暴露的属性如下&#xff1a; Live Camera和Live Blend分别表示当前active的virtu…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式&#xff1a; 3 LCD1602操作总结 1 代码工程 承接上文&#xff0c;在原有工程基础上&#xff0c;新建关于lcd1602的c和h…

k8s NetworkPolicy

Namespace 隔离 默认情况下&#xff0c;所有 Pod 之间是全通的。每个 Namespace 可以配置独立的网络策略&#xff0c;来 隔离 Pod 之间的流量。 v1.7 版本通过创建匹配所有 Pod 的 Network Policy 来作为默认的网络策略 默认拒绝所有 Pod 之间 Ingress 通信 apiVersion: …

【线程安全】关于死锁问题

文章目录 死锁的基本概念死锁的四个必要条件避免死锁避免死锁的算法死锁检测算法 死锁的基本概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然&#xff0c;线程之间同样也有死…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…

部署大语言模型并对话

随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;因其强大的语言理解和生成能力而备受关注。OpenWebUI &#xff0c;原名 Ollama WebUI &#xff0c;是一款专为大语言模型&#xff08;LLM&#xff09;设计的先进 Web 交互…

Facebook的未来蓝图:从元宇宙到虚拟现实的跨越

随着科技的不断演进和社会的数字化转型&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;作为下一代计算平台正逐渐走进人们的视野。作为全球领先的科技公司之一&#xff0c;Facebook正在积极探索并推动这一领域的发展&#xff0c;以实现其…

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘&#xff08;dashboard&#xff09;后&#xff0c;可以通过修改看板属性中的SLUG等&#xff0c;生成url 举例&#xff1a; http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式&#xff1a;此处参考了官…

论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能

摘要 思维链提示&#xff08;Chain-of-thought prompting&#xff09;在多种自然语言推理任务上展现了卓越的性能。然而&#xff0c;在需要解决的问题比提示中展示的示例更难的任务上&#xff0c;它的表现往往不佳。为了克服从简单到困难的泛化挑战&#xff0c;我们提出了一种新…

请你谈谈:BeanDefinition类作为Spring Bean的建模对象,与BeanFactoryPostProcessor之间的羁绊

那么&#xff0c;我们如何理解Spring Bean的建模对象呢&#xff1f;简而言之&#xff0c;它是指用于描述和配置Bean实例化过程的模型对象。有人可能会提出疑问&#xff0c;既然只需要Class&#xff08;类&#xff09;就可以实例化一个对象&#xff0c;Class作为类的元数据&…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下&#xff0c;我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作&#xff0c;更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点&#xff0c;开发了大量配套3D教材&#xff0c;让…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写&#xff0c;用于精确控制 HTML 页面的样式&#xff0c;以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的&#xff0c;好的浏览器有更好的显示&#xff0c;糟糕的浏览器…

C\C++ 终端输出带有颜色的字符

终端显示带有颜色的字符 终端显示带有颜色的字符 终端显示带有颜色的字符背景&#xff1a;测试机器&#xff0c;win10系统&#xff0c; VS2022编写字体设置不同的颜色背景色光标移动 &#xff08;这个用的估计不是很多&#xff09;字体设置动态显示C cout 也可以测试代码准确的…