【QT】day6

在这里插入图片描述

#include "home.h"
#include "ui_home.h"Home::Home(QWidget *parent): QWidget(parent), ui(new Ui::Home)
{ui->setupUi(this);// 从配置文件读取用户名QSettings settings("kim", "ad");username = settings.value("username").toString();usertype = settings.value("usertype").toString();ui->usertypelabel->setText(usertype);if(usertype=="学生"){ui->listframe->hide();ui->setframe->hide();ui->mainframe->hide();QFrame *stuframe = new QFrame();stuframe->setParent(this);stuframe->setStyleSheet("width:100px;height:100px;background-color: rgb(250, 250, 250);");stuframe->move(100,0);teachEdit = new QLineEdit(this);teachEdit->move(200,50);teachEdit->setStyleSheet("background-color:#ffffff;color:#000000;width:200px;height:30px;border-radius:7px;color:#000000;padding-left:10px;");teachEdit->setPlaceholderText("请输入教师账号");adkeyEdit = new QLineEdit(this);adkeyEdit->move(200,90);adkeyEdit->setStyleSheet("background-color:#ffffff;color:#000000;width:200px;height:30px;border-radius:7px;color:#000000;padding-left:10px;");adkeyEdit->setPlaceholderText("请输入签到验证码");adkeybtn = new QPushButton(this);adkeybtn->move(200,170);adkeybtn->setText("签到");adkeybtn->setStyleSheet("background-color:#000000;color:#ffffff;width:200px;height:40px;border-radius:7px;");connect(adkeybtn, &QPushButton::clicked, this, &Home::onAdKeyBtnClicked);stuHintLable = new QLabel(this);stuHintLable->move(210,140);stuHintLable->setFixedWidth(200);stuHintLable->setStyleSheet("color:rgb(222, 60, 51);height:40px;");}ui->usernamelabel->setText(username);ui->usertypelabel->setAlignment(Qt::AlignCenter);closeAllpage();openAdPage();
}Home::~Home()
{delete ui;
}void Home::onAdKeyBtnClicked() {if(teachEdit->text()==""){stuHintLable->setText("教师账号不能为空");stuHintLable->setStyleSheet("color:rgb(222, 60, 51);height:40px;");}else if(adkeyEdit->text()==""){stuHintLable->setText("签到激活码不能为空");stuHintLable->setStyleSheet("color:rgb(222, 60, 51);height:40px;");}else{socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::stuad_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::stuad_readyRead_slot);}}void Home::startad_connected_slot()
{struct data user;user.type=STARTAD;user.username=username;user.value=generateRandomString(6);ui->hintlable_3->setText("签到码:"+user.value);ui->startattendancebtn->setStyleSheet("background-color:#ffffff;border-radius:7px;border:1px solid #000000;color:#000000;");socket->write(user.toByteArray());
}void Home::startad_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));outputlog(receivedInfo.data);socket->disconnectFromHost();
}void Home::endad_connected_slot()
{struct data user;user.type=ENDAD;user.username=username;user.value="123";ui->hintlable_3->setText("");ui->startattendancebtn->setStyleSheet("background-color:#000000;border-radius:7px;color:#ffffff;");socket->write(user.toByteArray());
}void Home::endad_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));outputlog(receivedInfo.data);socket->disconnectFromHost();
}void Home::addname_connected_slot()
{struct data user;user.type=NAMEADD;user.username=username;user.value=ui->funcinput->text();socket->write(user.toByteArray());
}void Home::addname_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));outputlog("【"+ui->funcinput->text()+"】"+receivedInfo.data);ui->funcinput->clear();socket->disconnectFromHost();
}void Home::getAllName_connected_slot()
{struct data user;user.type=NAMEGETALL;user.username=username;user.value="123";socket->write(user.toByteArray());
}void Home::getAllName_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));QString receivedData(receivedInfo.data);QStringList records = receivedData.split("|", Qt::SkipEmptyParts);// 遍历每个记录ui->settable->setRowCount(records.size());for (int row = 0; row < records.size(); ++row) {// 以 '\n' 分割记录中的行QStringList lines = records[row].split("\n", Qt::SkipEmptyParts);// 遍历每行并添加到QTableWidget中for (int col = 0; col < lines.size(); ++col) {// 以 ':' 分割键和值QStringList keyValue = lines[col].split("&", Qt::SkipEmptyParts);QString key = keyValue[0].trimmed();QString value = keyValue[1].trimmed();QTableWidgetItem *item = new QTableWidgetItem(value);ui->settable->setItem(row, col, item);item->setTextAlignment(Qt::AlignCenter);}}ui->settable->setColumnWidth(0, 50);ui->settable->setColumnWidth(1, 100);ui->settable->setColumnWidth(2, 180);socket->disconnectFromHost();
}void Home::deletename_connected_slot()
{QList<QTableWidgetItem *> selectedItems = ui->settable->selectedItems();if (!selectedItems.isEmpty()) {int selectedRow = selectedItems.first()->row();QTableWidgetItem *item1 = ui->settable->item(selectedRow, 0);QString content1 = item1->text();struct data user;user.type=NAMEDELETE;user.username=username;user.value=content1;socket->write(user.toByteArray());} else {qDebug() << "No row selected.";}
}void Home::deletename_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));outputlog(receivedInfo.data);socket->disconnectFromHost();
}void Home::searchname_connected_slot()
{struct data user;user.type=NAMESEARCH;user.username=username;user.value=ui->funcinput->text();socket->write(user.toByteArray());
}void Home::searchname_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));QString receivedData(receivedInfo.data);QStringList records = receivedData.split("|", Qt::SkipEmptyParts);// 遍历每个记录ui->settable->setRowCount(records.size());for (int row = 0; row < records.size(); ++row) {// 以 '\n' 分割记录中的行QStringList lines = records[row].split("\n", Qt::SkipEmptyParts);// 遍历每行并添加到QTableWidget中for (int col = 0; col < lines.size(); ++col) {// 以 ':' 分割键和值QStringList keyValue = lines[col].split("&", Qt::SkipEmptyParts);QString key = keyValue[0].trimmed();QString value = keyValue[1].trimmed();QTableWidgetItem *item = new QTableWidgetItem(value);ui->settable->setItem(row, col, item);item->setTextAlignment(Qt::AlignCenter);}}ui->settable->setColumnWidth(0, 50);ui->settable->setColumnWidth(1, 100);ui->settable->setColumnWidth(2, 180);socket->disconnectFromHost();
}void Home::getadList_connected_slot()
{struct data user;user.type=NAMEHISTORY;user.username=username;user.value="123";socket->write(user.toByteArray());
}void Home::getadList_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));QString receivedData(receivedInfo.data);QStringList records = receivedData.split("|", Qt::SkipEmptyParts);// 遍历每个记录ui->settable->setRowCount(records.size());for (int row = 0; row < records.size(); ++row) {// 以 '\n' 分割记录中的行QStringList lines = records[row].split("\n", Qt::SkipEmptyParts);// 遍历每行并添加到QTableWidget中for (int col = 0; col < lines.size(); ++col) {// 以 ':' 分割键和值QStringList keyValue = lines[col].split("&", Qt::SkipEmptyParts);QString key = keyValue[0].trimmed();QString value = keyValue[1].trimmed();QTableWidgetItem *item = new QTableWidgetItem(value);ui->settable->setItem(row, col, item);item->setTextAlignment(Qt::AlignCenter);}}ui->settable->setColumnWidth(0, 50);ui->settable->setColumnWidth(1, 80);ui->settable->setColumnWidth(2, 80);ui->settable->setColumnWidth(3, 160);socket->disconnectFromHost();
}void Home::stuad_connected_slot()
{struct data user;user.type=STUAD;user.username=username;user.value=teachEdit->text();user.value1=adkeyEdit->text();socket->write(user.toByteArray());
}void Home::callname_connected_slot()
{struct data user;user.type=NAMECALL;user.username=username;user.value="123";user.value1="123";socket->write(user.toByteArray());
}void Home::callname_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));outputlog(receivedInfo.data);socket->disconnectFromHost();
}void Home::stuad_readyRead_slot()
{QByteArray rawData = socket->readAll();const char* rawCharArray = rawData.constData();socketinfo receivedInfo;memcpy(&receivedInfo, rawCharArray, sizeof(socketinfo));stuHintLable->setText(receivedInfo.data);stuHintLable->setStyleSheet("color:rgb(26, 136, 35);height:40px;");socket->disconnectFromHost();
}void Home::on_startattendancebtn_clicked()
{if(ui->startattendancebtn->text()=="发起签到"){socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::startad_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::startad_readyRead_slot);ui->startattendancebtn->setText("关闭签到");}else{socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::endad_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::endad_readyRead_slot);ui->startattendancebtn->setText("发起签到");ui->startattendancebtn->setStyleSheet("background-color:#000000;border-radius:7px;color:#ffffff;");}}void Home::outputlog(QString msg)
{ui->adEdit->setText("【"+getCurretTime()+"】"+msg+"\n"+ui->adEdit->toPlainText());
}QString Home::getCurretTime()
{QTime systime = QTime::currentTime();QString s = systime.toString("hh:mm:ss");return s;
}QString Home::generateRandomString(int length) {const QString charset = "123456789abcdefghijklmnpqrstuvwxyz";QString randomString;for (int i = 0; i < length; ++i) {int randomIndex = QRandomGenerator::global()->bounded(charset.length());randomString.append(charset.at(randomIndex));}return randomString;
}void Home::closeAllpage()
{ui->hintframe->hide();ui->hintframe_2->hide();ui->startattendancebtn->hide();ui->setmainframe->hide();ui->callnamebtn->hide();
}void Home::openAdPage()
{ui->hintframe->show();ui->hintframe_2->show();ui->startattendancebtn->show();ui->callnamebtn->show();this->setWindowTitle("签到管理系统v1.0-签到");
}void Home::openListPage()
{this->setWindowTitle("签到管理系统v1.0-记录");ui->setmainframe->show();ui->funcinput->hide();ui->addbtn->hide();ui->searchbtn->hide();ui->deletebtn->hide();ui->backbtn->hide();QStringList headerLabels;headerLabels << "ID" << "姓名" << "签到码" << "签到时间";ui->settable->setHorizontalHeaderLabels(headerLabels);ui->settable->verticalHeader()->setVisible(false);ui->settable->setColumnCount(4);ui->settable->setStyleSheet("QScrollBar:vertical {""    background: #ffffff;""    width: 10px;""    margin: 16px 0px 16px 0px;""}""QScrollBar::handle:vertical {""    background: rgb(78, 79, 79);""    min-height: 10px;""}""QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {""    border: none;""    background: none;""}""QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {""    background: none;""}""#settable{background-color:#ffffff;color:#000000;}""QTableWidget::item:selected {""    background-color: #eeeeee;""color:#000000;""}");socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::getadList_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::getadList_readyRead_slot);for (int row = 0; row < ui->settable->rowCount(); ++row) {for (int col = 0; col < ui->settable->columnCount(); ++col) {QTableWidgetItem *item = new QTableWidgetItem(QString("Row %1, Col %2").arg(row + 1).arg(col + 1));// 设置文本居中item->setTextAlignment(Qt::AlignCenter);}}
}void Home::openSetPage()
{this->setWindowTitle("签到管理系统v1.0-设置");ui->setmainframe->show();ui->funcinput->show();ui->addbtn->show();ui->searchbtn->show();ui->deletebtn->show();ui->backbtn->show();QStringList headerLabels;headerLabels << "ID" << "姓名" << "添加时间";ui->settable->setHorizontalHeaderLabels(headerLabels);ui->settable->verticalHeader()->setVisible(false);ui->settable->setColumnCount(3);ui->settable->setColumnWidth(2, 500);ui->settable->setStyleSheet("QScrollBar:vertical {""    background: #ffffff;""    width: 10px;""    margin: 16px 0px 16px 0px;""}""QScrollBar::handle:vertical {""    background: rgb(78, 79, 79);""    min-height: 10px;""}""QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {""    border: none;""    background: none;""}""QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {""    background: none;""}""#settable{background-color:#ffffff;color:#000000;}""QTableWidget::item:selected {""    background-color: #eeeeee;""color:#000000;""}");socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::getAllName_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::getAllName_readyRead_slot);for (int row = 0; row < ui->settable->rowCount(); ++row) {for (int col = 0; col < ui->settable->columnCount(); ++col) {QTableWidgetItem *item = new QTableWidgetItem(QString("Row %1, Col %2").arg(row + 1).arg(col + 1));// 设置文本居中item->setTextAlignment(Qt::AlignCenter);}}}void Home::on_callbtn_2_clicked()
{closeAllpage();openListPage();
}void Home::on_callbtn_clicked()
{closeAllpage();openAdPage();
}void Home::on_callbtn_3_clicked()
{closeAllpage();openSetPage();
}void Home::on_callnamebtn_clicked()
{socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::callname_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::callname_readyRead_slot);
}void Home::on_addbtn_clicked()
{socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::addname_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::addname_readyRead_slot);
}void Home::on_deletebtn_clicked()
{socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::deletename_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::deletename_readyRead_slot);}void Home::on_backbtn_clicked()
{// 创建 Widget 窗口Widget *w = new Widget();// 显示 Widget 窗口w->show();// 关闭当前 Home 窗口this->close();
}void Home::on_searchbtn_clicked()
{socket = new QTcpSocket(this);socket->connectToHost(ip,port);connect(socket,&QTcpSocket::connected,this,&Home::searchname_connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Home::searchname_readyRead_slot);
}

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

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

相关文章

【03】C++ 类和对象 2:默认成员函数

文章目录 &#x1f308; 前言&#x1f308; Ⅰ 构造函数1. 构造函数概念2. 构造函数特性3. 初始化列表 &#x1f308; Ⅱ 析构函数1. 析构函数概念2. 析构函数特性 &#x1f308; Ⅲ 拷贝构造1. 拷贝构造概念2. 拷贝构造特性3. 深度拷贝构造 &#x1f308; Ⅳ 赋值重载1. 运算符…

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…

单片机的省电模式及策略

目录 一、单片机省电的核心策略 二、单片机IO口的几种模式 三、单片机的掉电运行模式 &#xff08;1&#xff09; 浅谈cpu运行为什么会需要时钟&#xff1f; &#xff08;2&#xff09;STC15系列单片机内部可以配置时钟 &#xff08;3&#xff09;分频策略&#xff0c;降低…

数据结构与算法之美学习笔记:51 | 并行算法:如何利用并行处理提高算法的执行效率?

目录 前言并行排序并行查找并行字符串匹配并行搜索总结引申 前言 本节课程思维导图&#xff1a; 时间复杂度是衡量算法执行效率的一种标准。但是&#xff0c;时间复杂度并不能跟性能划等号。在真实的软件开发中&#xff0c;即便在不降低时间复杂度的情况下&#xff0c;也可以…

Linux应用开发---网络通信

Linux应用开发—网络通信 1 网络通信概述 Linux下的网络编程&#xff0c;我们一般称为 socket 编程&#xff0c;socket 是内核向应用层提供的一套网络编程接口&#xff0c;我们可以基于socket接口开发自己的网络相关应用程序。 1.1 socket 简介 套接字&#xff08;socket&…

Jenkins升级后,构建任务配置界面重复错位

最近我把公司的Jenkins服务升级到了最新版本&#xff0c;升级完成后&#xff0c;点了一下构建任务&#xff0c;发现能够构建成功&#xff0c;就以为顺利完成升级了&#xff0c;下班走了&#xff0c;结果第二天&#xff0c;进入构建任务配置界面发现&#xff0c;界面一团乱麻&am…

LabVIEW热电偶自动校准系统

设计并实现一套基于LabVIEW平台的工业热电偶自动校准系统&#xff0c;通过自动化技术提高校准效率和精度&#xff0c;降低人力成本&#xff0c;确保温度测量的准确性和可靠性。 工业生产过程中&#xff0c;温度的准确测量对产品质量控制至关重要。传统的热电偶校准方式依赖人工…

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07 第一题&#xff1a;移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

v-if 和v-for的联合规则及示例

第073个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

《游戏引擎架构》 -- 学习2

声明&#xff0c;定义&#xff0c;以及链接规范 翻译单元 声明与定义 链接规范 C/C 内存布局 可执行映像 程序堆栈 动态分配的堆 对象的内存布局 kilobyte 和 kibibyte 流水线缓存以及优化 未完待续。。。

SQL注入(SQL Injection)从注入到拖库 —— 简单的手工注入实战指南精讲

基本SQL注入步骤&#xff1a; 识别目标&#xff1a;确定目标网站或应用程序存在潜在的SQL注入漏洞。收集信息&#xff1a;通过查看页面源代码、URL参数和可能的错误信息等&#xff0c;搜集与注入有关的信息。判断注入点&#xff1a;确定可以注入的位置&#xff0c;比如输入框、…

【网工】华为设备命令学习(Telnet)

本次实验AR3为我们实际中远程的路由&#xff0c;AR4模拟我们的设备&#xff0c;最终实现Telnet的远程控制路由&#xff01; 本次笔记主要记录Telnet技术实现原理&#xff0c;后续再补充具体配置代码。 Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的…

基于微信小程序的新生报到系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

前端实现支付跳转以及回跳

// 支付地址 const baseURL http://pcapi-xiaotuxian-front-devtest.itheima.net/ const backURL http://127.0.0.1:5173/paycallback const redirectUrl encodeURIComponent(backURL) const payUrl ${baseURL}pay/aliPay?orderId${route.query.id}&redirect${redirec…

【精选】java初识多态 子类继承父类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

github拉取项目,pycharm配置远程服务器环境

拉取项目 从github上拉取项目到pycharmpycharm右下角选择远程服务器上的环境 2.1. 如图 2.2. 输入远程服务器的host&#xff0c;port&#xff0c;username&#xff0c;password连接 2.3. 选择服务器上的环境 链接第3点 注&#xff1a;如果服务器上环境不存在&#xff0c;先创建…

vue3-内置组件-Teleport

Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 基本用法 有时我们可能会遇到这样的场景&#xff1a;一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看…

基于Linux操作系统的Docker容器安装MySQL随笔

1、在Linux上安装Docker容器 cd /etc/yum.repos.d/ curl -O https://download.docker.com/linux/centos/docker-ce.repo sed -i s/$releasever/8/g docker-ce.repo yum install -y docker-ce 2、修改Docker默认镜像仓库&#xff0c;然后启动Docker容器 sudo mkdir -p /etc/do…

yolov8自制数据训练集

目录 1.YOLOv8是啥 2.系统环境 3.安装labelimg 3.1安装 3.2启动 labelimg 4.自制分类图片 4.1 YOLO数据集要求 4.2 图片保存目录 4.3 利用labelimg进行标注 4.4 存储图片 4.5 标注文件 5.数据集训练 5.1yaml文件 5.2训练命令 5.3查看训练过程 5.3.1启动tensorb…