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

news2024/11/13 23:33:41

文章目录

  • 一、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 gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += 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.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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_NAMESPACE

class 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);
    } // setupUi

    void 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 Ui

QT_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.coloradmin.cn/o/1927021.html

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

相关文章

C1W1.LAB.Preprocessing+Word frequencies+Logistic_regression_model

理论课&#xff1a;C1W1.Sentiment Analysis with Logistic Regression 文章目录 预处理导入包Twitter dataset简介查看原始文本处理原始文本处理超链接、Twitter 标记和样式分词去除标点和停用词词干处理 process_tweet() 词频构建与可视化导入包加载数据集字典字典实例添加或…

cesium 实现地图环境功能 - 雨,雪,雾特效

需求背景解决效果Codeindex.vuefogEffect.tsrain.glslsnow.glslfog.glsl 需求背景 需要实现天气模拟&#xff0c;日照模拟功能&#xff0c;提高三维实景效果 解决效果 Code 注意&#xff1a;我以下glsl文件时基于 webgl1.0&#xff0c;即cesium&#xff0c;创建球的时候&…

ES的使用示例

1.安装 ES的安装对springboot的版本配置要求很高&#xff0c;需要根据如下的目录下载对应的版本。 查看自己项目所使用的springboot和spring的版本&#xff0c;对应下载文件。 下载链接地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-…

微软GraphRAG原理介绍(附带部分源码)

我们前几天写了一篇文章&#xff0c;简单跑了一下GraphRAG看了下效果&#xff0c;没看过这篇文章的可以看下https://www.luxinfeng.top/article/动手实操微软开源的GraphRAG。今天我们介绍一下GraphRAG的实现原理&#xff0c;关于实验对比的内容&#xff0c;我会在下一篇文章中…

48V电源架构解析

48V电源架构解析 48V系统的诞生 汽车在1918年引入蓄电池&#xff0c;到1920年逐渐普及&#xff0c;当时的电池电压是6V。后来&#xff0c;随着内燃机排量的增加以及高压缩比内燃机的出现&#xff0c;6V系统已经不能满足需求&#xff0c;于是在1950年引入了12V系统。大多数汽车…

【python学习】标准库之数学相关math库的定义、功能、使用场景、代码示例和第三方数学相关库NumPy

引言 math模块是Python标准库的一部分&#xff0c;它提供了一系列基本的数学函数和常数。这些函数和常数对于日常的数学运算非常有用&#xff0c;例如计算平方根、计算余弦值等。 文章目录 引言一、math的定义二、math的功能2.1 基本的数学运算2.2 数学常数2.3 随机数 三、math…

八臂-聚乙二醇-生物素;8ARM-PEG-Biotin

一、基本信息 名称&#xff1a;八臂PEG生物素、八臂-聚乙二醇-生物素、Octa-arm PEG Biotin、8ARM-PEG-Biotin 结构&#xff1a;具有八个分支的PEG链&#xff0c;每个分支末端连接生物素分子 状态&#xff1a;固体/粉末/溶液&#xff0c;具体取决于产品规格和存储条件 纯度&…

论文去AI痕秘籍:轻松几步,守护你的学术原创性

如何有效降低AIGC论文的重复率&#xff0c;也就是我们说的aigc如何降重&#xff1f;AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文&#xff0c;就一定要在交稿之前做一下AIGC降重的检查。一般来说&#xff0c;如果论文的AIGC超过30%&#xff0c;很可能会被判定…

Qt|QTreewidget类下函数qt助手详解说明示例(二)

上篇&#xff1a;Qt|QTreewidget类下函数qt助手详解说明示例&#xff08;一&#xff09; 该系列持续更新&#xff0c;喜欢请一键三连&#xff0c;一起学习进步&#xff0c;升职加薪&#xff0c;感谢各位大佬。 QT5.14.2 参考官方QT助手 Kimi辅助说明 文章目录 insertTopLevelI…

浅学三次握手

数据要完成传输&#xff0c;必须要建立连接。由于建立TCP连接的过程需要来回3次&#xff0c;所以&#xff0c;将这个过程形象的叫做三次握手。 结合上面的图来看更清楚。 先说三次握手吧&#xff0c;连接是后续数据传输的基础。就像我们打电话一样&#xff0c;必须保证我和对方…

工作是为了什么

如果经常和总监及以上的领导聊天&#xff0c;就会发现他们与咱们一线程序员的最大不同&#xff0c;并不是编程技能多高深精通&#xff0c;而是分析问题、认知世界的方式。 程序员只关注工作领域的“一亩三分地”&#xff0c;实质上是放弃了自己成长的机会&#xff0c;在工作的…

软件测试——非功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

53 传输层

作用&#xff1a;负责数据能够从发送端传输接收端 再谈端口号 端口号&#xff08;port&#xff09;标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中&#xff0c;用“源IP”&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”&#xff0c…

陶晶驰串口屏与arduino uno通信,远程控制arduino 2560上的LED

一 材料清单 arduino uno 1个 arduino 2560 1个 nrf24l01 2个 陶晶驰串口屏 1个 二 本文目的 通过串口屏触摸按键远程控制arduino 2560上的LED 点亮。 三 硬件接线 3.1 发射端接线 3.1.1uno和发射模块接线 nRF24L01 与Arduino UNO接线如…

你也想做一个Elemen-ui吧!!!——Blueの前端路

目录 前言 diglog组件 准备工作&#xff1a; 在diglog.vue中模仿element-ui搭建diglog框架 该组件需要完成的任务&#xff1a; title diglog.vue代码&#xff1a; App.vue代码&#xff1a; 效果&#xff1a; 自定义dialog的宽度和距离顶部的 App.vue代码&#xff1a;…

Windows 下 VMamba 安装教程(无需更改base环境中的cuda版本且可加速)

导航 Mamba 及 Vim 安装问题参看本人之前博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法Windows 下 Mamba 的安装参看本人之前博客&#xff1a;Window 下Mamba 环境安装踩坑问题汇总及解决方法 &#xff08;无需绕过selective_scan_cuda&#xff09;Linux 下VMamba 安…

前端面试题(JS篇三)

一、|| 和 && 操作符的返回值&#xff1f; || 和 && 首先会对第一个操作数执行条件判断&#xff0c;如果其不是布尔值就先进行 ToBoolean 强制类型转换&#xff0c;然后再执行条件判断。 对于 || 来说&#xff0c;如果条件判断结果为 true 就返回第一个操作数的…

磁环编码器原理

目录 概述 1 编码器介绍 2 实现原理介绍 2.1 磁环功能分析 2.2 硬件实现方式 3 编码器参数 3.1 编码器精度 3.2 影响编码器精度的因素 4 角度计算方法 4.1 单对极编码器 4.2 磁游标编码器 4.2.1 游标方案实现原理 4.2.2 一个实例磁环分析 5 磁刻线编码器 概述 本…

算法题-二叉树

二叉树 二叉树的理论知识 二叉树的种类 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的节点和度为2的节点&#xff0c;并且度为0的节点在同一层&#xff0c;则此二叉树为满二叉树&#xff08;深度为k&#xff0c;有2^k-1个节点的二叉树&#xff09;。 完全二叉…