Qt 联合Halcon视觉框架(2)

news2024/12/20 3:03:43

文章目录

  • 匹配类
    • 构造函数初始化布局变量
    • 初始化图片
    • 匹配
    • 匹配计时器事件
    • 开启计时器
    • 停止
    • 析构函数

Qt 联合Halcon视觉框架(1)

匹配类

#if QT_VERSION >= 0x050000
    #include <QtWidgets/qlabel.h>
    #include <QtWidgets/qpushbutton.h>
#else
    #include <qlabel.h>
    #include <qpushbutton.h>
#endif

// 根据 Qt 版本选择合适的头文件。对于 Qt 5 及以上版本,使用 Qt Widgets 模块中的头文件。
// 对于较早版本的 Qt,则直接包含旧版的头文件。

#include <QScopedPointer>
#include "qhalconwindow.h"

class Matching: public QWidget
{
  Q_OBJECT

public:
    // 构造函数,初始化 Matching 小部件,并可选地指定父小部件。
    // parent 参数允许将这个小部件嵌入到另一个窗口或小部件中。
    Matching(QWidget *parent = nullptr);

    // 析构函数,确保正确清理资源。
    virtual ~Matching(void);

    // 初始化前景(Foreground)变量。
    void InitFg(void);

protected slots:
    // 创建模型的槽函数。
    void Create(void);

    // 开始匹配过程的槽函数。
    void Start(void);

    // 停止匹配过程的槽函数。
    void Stop(void);

protected:
    // 定时器事件处理函数,用于周期性任务(如更新显示或执行匹配)。
    void timerEvent(QTimerEvent*);

    // 开始匹配过程的辅助函数。
    void StartMatching(void);

private:
    // HALCON 相关变量
    Hlong ImageWidth, ImageHeight;           // 图像宽度和高度
    HalconCpp::HTuple FGHandle;              // 前景句柄
    HalconCpp::HImage Image;                 // 当前图像
    QScopedPointer<HalconCpp::HShapeModel> ShapeModel; // 形状模型智能指针
    HalconCpp::HTuple ModelRow, ModelColumn; // 模型参考点的行和列坐标
    HalconCpp::HTuple Rect1Row, Rect1Col, Rect2Row, Rect2Col; // 区域矩形的角点坐标
    HalconCpp::HTuple RectLength1, RectLength2; // 矩形的边长
    HalconCpp::HObject ShapeModelRegion;     // 形状模型区域对象

    // GUI 元素
    QLabel *MatchTimeLabel;                  // 显示匹配时间的标签
    QLabel *MatchScoreLabel;                 // 显示匹配得分的标签
    QLabel *MeasTimeLabel;                   // 显示测量时间的标签
    QLabel *NumLeadsLabel;                   // 显示导线数量的标签
    QLabel *MinLeadsDistLabel;               // 显示最小导线距离的标签
    QPushButton *CreateButton;               // 创建模型按钮
    QPushButton *StartButton;                // 开始匹配按钮
    QPushButton *StopButton;                 // 停止匹配按钮
    QHalconWindow *Disp;                     // 显示 HALCON 图像的窗口

    // 定时器
    long Timer;                              // 定时器 ID,用于周期性任务
};

构造函数初始化布局变量

Matching::Matching(QWidget *parent)
    : QWidget(parent), Timer(-1)
{
  // 创建按钮并设置信号槽连接
  // CreateButton:创建模型按钮,点击时调用 Create 槽函数。
  CreateButton = new QPushButton(tr("Create Model"), this);
  connect(CreateButton, SIGNAL(clicked()), SLOT(Create()));

  // StartButton:开始匹配按钮,初始状态下禁用,点击时调用 Start 槽函数。
  StartButton = new QPushButton(tr("Start"), this);
  StartButton->setEnabled(false);
  connect(StartButton, SIGNAL(clicked()), SLOT(Start()));

  // StopButton:停止匹配按钮,初始状态下禁用,点击时调用 Stop 槽函数。
  StopButton = new QPushButton(tr("Stop"), this);
  StopButton->setEnabled(false);
  connect(StopButton, SIGNAL(clicked()), SLOT(Stop()));

  // 创建标签用于显示信息
  QLabel *match_time = new QLabel(tr("Matching:"), this);
  QLabel *match_time2 = new QLabel(tr("Time:"), this);
  MatchTimeLabel = new QLabel("        ", this); // 显示匹配时间

  QLabel *match_score = new QLabel(tr("Score:  "), this);
  MatchScoreLabel = new QLabel("        ", this); // 显示匹配得分

  QLabel *meas_time = new QLabel(tr("Measure:"), this);
  QLabel *meas_time2 = new QLabel(tr("Time:"), this);
  MeasTimeLabel = new QLabel("        ", this); // 显示测量时间

  QLabel *num_leads = new QLabel(tr("Number of leads:  "), this);
  NumLeadsLabel = new QLabel("        ", this); // 显示导线数量

  QLabel *min_lead_dist = new QLabel(tr("Minimum Lead Distance:  "), this);
  MinLeadsDistLabel = new QLabel("        ", this); // 显示最小导线距离

  // 创建 Mvtec 标签并设置字体样式
  QLabel *MvtecLabel = new QLabel("\xa9 2004-2017 MVTec Software GmbH", this);
  MvtecLabel->setFont(QFont(nullptr, 10, QFont::Bold));

  // 创建 HALCON 小部件使用说明标签
  QLabel *DispHintLabel = new QLabel(
      "Zoom: mouse wheel; Move: left mouse button; Reset: double click", this);

  // 设置布局
  // 最外层垂直布局 TopBox
  QVBoxLayout *TopBox = new QVBoxLayout(this);

  // Mvtec 标签水平布局
  QHBoxLayout *Mvtec = new QHBoxLayout;
  Mvtec->addStretch(1); // 左侧伸缩空间
  Mvtec->addWidget(MvtecLabel); // 添加 Mvtec 标签
  Mvtec->addStretch(1); // 右侧伸缩空间

  // 内部垂直布局 TopVBox
  QVBoxLayout *TopVBox = new QVBoxLayout;

  // 包含 HALCON 小部件和按钮的水平布局 HBoxDispAndButtons
  QHBoxLayout *HBoxDispAndButtons = new QHBoxLayout;

  // 创建 HALCON 窗口小部件 Disp,并设置最小尺寸
  Disp = new QHalconWindow(this);
  Disp->setMinimumSize(50, 50);

  // 包含 HALCON 小部件和提示标签的垂直布局 DispVBox
  QVBoxLayout *DispVBox = new QVBoxLayout;
  DispVBox->addWidget(Disp, 1); // 添加 HALCON 小部件
  DispVBox->addSpacing(8); // 添加间距
  DispVBox->addWidget(DispHintLabel); // 添加提示标签

  // 包含按钮的垂直布局 Buttons
  QVBoxLayout *Buttons = new QVBoxLayout;
  Buttons->addWidget(CreateButton); // 添加创建按钮
  Buttons->addSpacing(8); // 添加间距
  Buttons->addWidget(StartButton); // 添加开始按钮
  Buttons->addSpacing(8); // 添加间距
  Buttons->addWidget(StopButton); // 添加停止按钮
  Buttons->addStretch(1); // 底部伸缩空间

  // 将 HALCON 小部件和按钮布局添加到 HBoxDispAndButtons
  HBoxDispAndButtons->addSpacing(15); // 左侧间距
  HBoxDispAndButtons->addLayout(DispVBox, 1); // 添加 HALCON 和提示标签布局
  HBoxDispAndButtons->addSpacing(15); // 中间间距
  HBoxDispAndButtons->addLayout(Buttons); // 添加按钮布局
  HBoxDispAndButtons->addSpacing(15); // 右侧间距

  // 创建包含标签的水平布局 HBoxLabels
  QHBoxLayout *HBoxLabels = new QHBoxLayout;

  // 创建网格布局 Labels 用于排列多个标签
  QGridLayout *Labels = new QGridLayout();
  Labels->addWidget(match_time, 0, 0); // 第一行第零列
  Labels->addWidget(match_time2, 0, 1); // 第一行第一列
  Labels->addWidget(MatchTimeLabel, 0, 2); // 第一行第二列
  Labels->addWidget(match_score, 0, 3); // 第一行第三列
  Labels->addWidget(MatchScoreLabel, 0, 4); // 第一行第四列
  Labels->addWidget(meas_time, 1, 0); // 第二行第零列
  Labels->addWidget(meas_time2, 1, 1); // 第二行第一列
  Labels->addWidget(MeasTimeLabel, 1, 2); // 第二行第二列
  Labels->addWidget(num_leads, 1, 3); // 第二行第三列
  Labels->addWidget(NumLeadsLabel, 1, 4); // 第二行第四列
  Labels->addWidget(min_lead_dist, 1, 5); // 第二行第五列
  Labels->addWidget(MinLeadsDistLabel, 1, 6); // 第二行第六列

  // 将网格布局添加到 HBoxLabels
  HBoxLabels->addSpacing(15); // 左侧间距
  HBoxLabels->addLayout(Labels); // 添加网格布局
  HBoxLabels->addSpacing(130); // 右侧间距

  // 将 HBoxDispAndButtons 和 HBoxLabels 添加到 TopVBox
  TopVBox->addLayout(HBoxDispAndButtons);
  TopVBox->addSpacing(15); // 中间间距
  TopVBox->addLayout(HBoxLabels);

  // 将 TopVBox 和 Mvtec 布局添加到最外层布局 TopBox
  TopBox->addSpacing(15); // 上方间距
  TopBox->addLayout(TopVBox);
  TopBox->addSpacing(15); // 中间间距
  TopBox->addLayout(Mvtec);
  TopBox->addSpacing(10); // 下方间距
}

初始化图片

void Matching::InitFg(void)
{
  using namespace HalconCpp;

  // 打开帧采集器并获取初始图像
  // 使用 OpenFramegrabber 函数打开一个帧采集器(这里使用文件作为源),并获取句柄 FGHandle。
  // 参数解释:
  // - "File":指定帧采集器类型为文件。
  // - 后续参数为默认值或特定配置,如宽度、高度等。
  // - "board/board.seq":指定要读取的图像序列文件路径。
  // - 最后两个参数 "-1, 1" 分别表示最小和最大图像编号,-1 表示无限制。
  OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default",
                   "board/board.seq", "default", -1, 1, &FGHandle);

  // 使用 GrabImage 函数从帧采集器中抓取一幅图像,并存储到 Image 变量中。
  GrabImage(&Image, FGHandle);

  // 获取图像尺寸,并将宽度和高度存储到 ImageWidth 和 ImageHeight 成员变量中。
  Image.GetImageSize(&ImageWidth, &ImageHeight);

  // 设置 HALCON 窗口显示区域为整个图像大小。
  // SetPart 的参数 (0, 0, ImageHeight-1, ImageWidth-1) 表示将显示区域设置为图像的完整范围。
  Disp->GetHalconBuffer()->SetPart(0, 0, ImageHeight - 1, ImageWidth - 1);

  // 设置 HALCON 窗口中线条的宽度为 3。
  Disp->GetHalconBuffer()->SetLineWidth(3);

  // 在 HALCON 窗口中显示抓取到的图像。
  Disp->GetHalconBuffer()->DispObj(Image);

  // 刷新 HALCON 缓冲区以应用更改并更新显示。
  Disp->GetHalconBuffer()->FlushBuffer();
}

匹配

void Matching::StartMatching(void)
{
  using namespace HalconCpp;

  double S1, S2;
  HTuple Rect1RowCheck, Rect1ColCheck, Rect2RowCheck, Rect2ColCheck;
  HTuple MeasureHandle1, MeasureHandle2, NumLeads;
  HTuple RowCheck, ColumnCheck, AngleCheck, Score, HomMat2D, MinDistance;
  HTuple RowEdgeFirst1, ColumnEdgeFirst1, AmplitudeFirst1;
  HTuple RowEdgeSecond1, ColumnEdgeSecond1, AmplitudeSecond1;
  HTuple IntraDistance1, InterDistance1;
  HTuple RowEdgeFirst2, ColumnEdgeFirst2, AmplitudeFirst2;
  HTuple RowEdgeSecond2, ColumnEdgeSecond2, AmplitudeSecond2;
  HTuple IntraDistance2, InterDistance2;
  HObject ShapeModelTrans;
  HObject Rectangle1, Rectangle2;
  HImage Image;
  char buf[MAX_STRING];
  QString string;

  // 抓取下一帧图像并显示
  GrabImage(&Image, FGHandle);
  Disp->GetHalconBuffer()->DispObj(Image);

  // 开始计时以测量匹配时间
  S1 = HSystem::CountSeconds();
  
  // 在当前图像中查找模型实例
  ShapeModel->FindShapeModel(Image, 0, 2 * PI, 0.7, 1, 0.5, "least_squares", 4, 0.7,
                             &RowCheck, &ColumnCheck, &AngleCheck, &Score);
  
  // 结束计时并更新匹配时间标签
  S2 = HSystem::CountSeconds();
  sprintf(buf, "%5.2f", (S2 - S1) * 1000);
  string = buf;
  MatchTimeLabel->setText(string);

  // 如果找到了一个匹配结果(即 Score 的长度为 1)
  if (Score.Length() == 1)
  {
    // 更新匹配得分标签
    sprintf(buf, "%7.5f", (double)Score[0]);
    string = buf;
    MatchScoreLabel->setText(string);

    // 根据匹配结果旋转模型用于可视化
    VectorAngleToRigid(ModelRow, ModelColumn, 0, RowCheck, ColumnCheck, AngleCheck, &HomMat2D);
    AffineTransRegion(ShapeModelRegion, &ShapeModelTrans, HomMat2D, "false");
    Disp->GetHalconBuffer()->SetColor("green");
    Disp->GetHalconBuffer()->DispObj(ShapeModelTrans);

    // 计算测量矩形的参数
    AffineTransPixel(HomMat2D, Rect1Row, Rect1Col, &Rect1RowCheck, &Rect1ColCheck);
    AffineTransPixel(HomMat2D, Rect2Row, Rect2Col, &Rect2RowCheck, &Rect2ColCheck);

    // 生成两个测量矩形作为区域并显示它们
    GenRectangle2(&Rectangle1, Rect1RowCheck, Rect1ColCheck, AngleCheck, RectLength1, RectLength2);
    GenRectangle2(&Rectangle2, Rect2RowCheck, Rect2ColCheck, AngleCheck, RectLength1, RectLength2);
    Disp->GetHalconBuffer()->SetColor("blue");
    Disp->GetHalconBuffer()->SetDraw("margin");
    Disp->GetHalconBuffer()->DispObj(Rectangle1);
    Disp->GetHalconBuffer()->DispObj(Rectangle2);
    Disp->GetHalconBuffer()->SetDraw("fill");

    // 执行实际测量
    S1 = HSystem::CountSeconds();

    // 创建测量句柄
    GenMeasureRectangle2(Rect1RowCheck, Rect1ColCheck, AngleCheck, RectLength1, RectLength2,
                         ImageWidth, ImageHeight, "bilinear", &MeasureHandle1);
    GenMeasureRectangle2(Rect2RowCheck, Rect2ColCheck, AngleCheck, RectLength1, RectLength2,
                         ImageWidth, ImageHeight, "bilinear", &MeasureHandle2);

    // 进行边缘检测和测量
    MeasurePairs(Image, MeasureHandle1, 2, 90, "positive", "all",
                 &RowEdgeFirst1, &ColumnEdgeFirst1, &AmplitudeFirst1,
                 &RowEdgeSecond1, &ColumnEdgeSecond1, &AmplitudeSecond1,
                 &IntraDistance1, &InterDistance1);
    MeasurePairs(Image, MeasureHandle2, 2, 90, "positive", "all",
                 &RowEdgeFirst2, &ColumnEdgeFirst2, &AmplitudeFirst2,
                 &RowEdgeSecond2, &ColumnEdgeSecond2, &AmplitudeSecond2,
                 &IntraDistance2, &InterDistance2);

    // 关闭测量句柄
    CloseMeasure(MeasureHandle1);
    CloseMeasure(MeasureHandle2);

    S2 = HSystem::CountSeconds();

    // 显示测量结果
    Disp->GetHalconBuffer()->SetColor("red");
    Disp->GetHalconBuffer()->DispLine(
      RowEdgeFirst1 - RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeFirst1 - RectLength2 * AngleCheck.TupleSin(),
      RowEdgeFirst1 + RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeFirst1 + RectLength2 * AngleCheck.TupleSin());
    Disp->GetHalconBuffer()->DispLine(
      RowEdgeSecond1 - RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeSecond1 - RectLength2 * AngleCheck.TupleSin(),
      RowEdgeSecond1 + RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeSecond1 + RectLength2 * AngleCheck.TupleSin());
    Disp->GetHalconBuffer()->DispLine(
      RowEdgeFirst2 - RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeFirst2 - RectLength2 * AngleCheck.TupleSin(),
      RowEdgeFirst2 + RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeFirst2 + RectLength2 * AngleCheck.TupleSin());
    Disp->GetHalconBuffer()->DispLine(
      RowEdgeSecond2 - RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeSecond2 - RectLength2 * AngleCheck.TupleSin(),
      RowEdgeSecond2 + RectLength2 * AngleCheck.TupleCos(),
      ColumnEdgeSecond2 + RectLength2 * AngleCheck.TupleSin());

    // 更新测量时间标签
    sprintf(buf, "%5.2f", (S2 - S1) * 1000);
    string = buf;
    MeasTimeLabel->setText(string);

    // 更新导线数量标签
    NumLeads = IntraDistance1.Length() + IntraDistance2.Length();
    sprintf(buf, "%2ld", (Hlong)NumLeads[0]);
    string = buf;
    NumLeadsLabel->setText(string);

    // 更新最小导线距离标签
    MinDistance = (InterDistance1.TupleConcat(InterDistance2)).TupleMin();
    sprintf(buf, "%6.3f", (double)MinDistance[0]);
    string = buf;
    MinLeadsDistLabel->setText(string);
  }

  // 刷新 HALCON 缓冲区以应用所有更改并更新显示
  Disp->GetHalconBuffer()->FlushBuffer();
}

匹配计时器事件

void Matching::timerEvent(QTimerEvent*)
{
  StartMatching();
}

开启计时器

void Matching::Start(void)
{
  StartButton->setEnabled(false);
  StopButton->setEnabled(true);
  // Start Timer -> ::timerEvent() is called continously
  Timer = startTimer(20);
}

停止

// Stop continuous matching
void Matching::Stop(void)
{
  StartButton->setEnabled(true);
  StopButton->setEnabled(false);
  // Kill Timer
  if (Timer != -1)
  {
    killTimer(Timer);
    Timer = -1;
  }
}

析构函数

Matching::~Matching(void)
{
  using namespace HalconCpp;

  // Close all allocated HALCON resources.
  CloseFramegrabber(FGHandle);
  if (Timer != -1)
  {
    killTimer(Timer);
    Timer = -1;
  }
}

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

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

相关文章

SpringBoot+vue实现WebSocket通信

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务器主动向客户端推送数据。 WebSocket的主要特点&#xff1a; 全双工通信&#xff1a;客户端和服务器之间的数据可以同时双向传输低延迟&…

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…

H5 中 van-popup 的使用以及题目的切换

H5 中 van-popup 的使用以及题目的切换 在移动端开发中&#xff0c;弹窗组件是一个常见的需求。vant 是一个轻量、可靠的移动端 Vue 组件库&#xff0c;其中的 van-popup 组件可以方便地实现弹窗效果。本文将介绍如何使用 van-popup 实现题目详情的弹窗展示&#xff0c;并实现…

【第一节】Git的简介和安装

目录 一、git的介绍 二、git 的安装 2.1 Linux 平台安装 2.2 源码安装 2.3 Windows 平台安装 2.4 Mac 平台安装 2.5 Git 配置 2.5.1 配置文件 2.5.2 用户信息配置 2.5.3 文本编辑器配置 2.5.4 差异分析工具配置 2.5.5 查看配置信息 一、git的介绍 Git 是一种开源的…

奇怪的知识又增加了,ESP32下的Lisp编程:ULisp--Lisp for microcontrollers

ESP32下有MicroPython&#xff0c;那么我就在想&#xff0c;有Lisp语言支持吗&#xff1f;答案是果然有&#xff01;有ULisp&#xff0c;专门为MCU设计的Lisp&#xff01; 网址&#xff1a;uLisp - Lisp for microcontrollers 介绍&#xff1a;用于微控制器的 Lisp 适用于 Ar…

决策树的生成与剪枝

决策树的生成与剪枝 决策树的生成生成决策树的过程决策树的生成算法 决策树的剪枝决策树的损失函数决策树的剪枝算法 代码 决策树的生成 生成决策树的过程 为了方便分析描述&#xff0c;我们对上节课中的训练样本进行编号&#xff0c;每个样本加一个ID值&#xff0c;如图所示…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&a…

Kerberos实验

kdc&#xff1a;192.168.72.163 客户端&#xff08;机器账户win10&#xff09;&#xff1a;192.168.72.159 用户&#xff1a;administrator 抓包&#xff1a;开机登录win10&#xff0c;使用administrator域用户凭据登录。 生成 Kerberos 解密文件 抓取 krbtgt 用户和 win1…

AI一键分析小红书对标账号‼️

宝子们&#xff0c;AI小助手近期发现了一款宝藏AI工具&#xff0c;拥有对标账号AI分析功能&#xff0c;只需10秒就能全面掌握对标账号的运营情况&#xff0c;并且可以根据分析结果提供创作方向和灵感&#xff0c;轻松助力1:1复刻起号&#xff01; 功能亮点&#xff1a; &…

大腾智能CAD:国产云原生三维设计新选择

在快速发展的工业设计领域&#xff0c;CAD软件已成为不可或缺的核心工具。它通过强大的建模、分析、优化等功能&#xff0c;不仅显著提升了设计效率与精度&#xff0c;还促进了设计思维的创新与拓展&#xff0c;为产品从概念构想到实体制造的全过程提供了强有力的技术支持。然而…

VMware虚拟机 Ubuntu没有共享文件夹的问题

在虚拟机的Ubuntu系统中&#xff0c;共享文件目录存放在 mnt/hgfs 下面&#xff0c;但是我安装完系统并添加共享文件后发现&#xff0c;在mnt下连/hgfs目录都没有。 注意&#xff1a;使用共享文件目录需要已安装VMtools工具。 添加共享文件目录 一&#xff1a;在超级用户下 可…

OpenGL ES 01 渲染一个四边形

项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…

leetcode二叉搜索树部分笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 二叉搜索树 1. 二叉搜索树的最小绝对差2. 二叉搜索树中第 K 小的元素3. 验证二叉搜索树 1. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中…

推送本地仓库到远程git仓库

目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容&#xff0c;从新建库&#xff0c;同时创建一个 A.txt 文件 清空原有的远程仓库内容&#xff0c;重新创建一个新的仓库&#xff0c;…

暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)

前提 之前开自己的GitHub项目&#xff0c;想着不是团队项目&#xff0c;偷懒没有配置eslint&#xff0c;后面发现还是不行。eslint的存在可以帮助我们规范代码格式&#xff0c;同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外&#xff0c;团队使用eslint也是好处颇多…

基于微信小程序的小区疫情防控ssm+论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

[面试题]--索引用了什么数据结构?有什么特点?

答&#xff1a;使用了B树&#xff1a; 时间复杂度&#xff1a;O(logN),可以有效控制树高 B树特点&#xff1a; 1.叶子节点之间有相互链接的作用&#xff0c;会指向下一个相近的兄弟节点。 MySQL在组织叶子节点使用的是双向链表 2.非叶子节点的值都保存在叶子节点当中 MySQL非叶…

Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label

最近刚进行 Vue3 Element plus 项目实践&#xff0c;在进行表单二次封装的时候&#xff0c;表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label&#xff0c;下面上代码&#xff1a; 原来的写法&#xff1a; <el-selectv-if"v.type select"…