c++之qt学习 基本介绍 界面设计 串口

news2024/11/25 6:59:28

这里写目录标题

  • qt基类介绍
  • qt不同版本
  • qt下载
  • 打开qt creater
  • 制作简单qt界面
  • ui界面
    • 点击forms,双击ui文件,就可以进入ui编辑器
  • qt信号和槽
  • 给界面增加图片
  • 界面布局
    • 布局不会影响代码
  • 界面切换
    • 更改代码
      • 验证账号密码
  • qt的三驾马车
  • 串口助手
    • 为下拉框加入属性信息
    • 串口号栏设置
      • 进一步配置
    • 串口实现逻辑功能
    • 初始化串口, 利用打开按钮 触发串口打开,这用到信号槽
    • 关闭功能
    • 接收功能
    • 发送功能 和 清空功能
    • Q_OBJECT
    • 宏定义
    • explicit
    • private slots
  • 打包为windows软件
      • 封包操作 需要用到qt的控制台
    • exe需要相应的动态依赖库才能执行

qt基类介绍

在Qt中,创建工程时基类QWidget表示创建一个基于 QWidget 的窗口应用程序,而其他选项则表示不同类型的应用程序。

下面是几个常见的Qt工程类型及其对应的选项:

  • 控制台应用程序(Console Application):使用QCoreApplication作为应用程序类,没有图形用户界面。
  • 主窗口应用程序(Main Window):使用QMainWindow作为主窗口,可以通过添加菜单栏、工具栏等功能来创建复杂的应用程序。
  • 对话框应用程序(Dialog):使用QDialog作为主窗口,常用于包含少量控件的小型应用程序或功能性对话框。
  • 控件应用程序(Widget):使用QWidget作为主窗口,可以自由布局和组合多个控件,适用于自定义控件和复杂的用户界面。

除了上述常见的类型,Qt还提供了很多其他类型的应用程序模板,比如OpenGL应用程序、Qt Quick应用程序等。每个模板都有其特定的用途和功能,开发者可以根据实际需求选择并进行定制。

需要注意的是,选择不同类型的应用程序会影响生成的代码和文件结构,但不会限制你使用任何Qt库或控件。因此,在选择应用程序类型时,应该根据实际需求选择最合适的类型,并根据需求使用Qt提供的各种功能和工具来进行开发。

qt不同版本

https://blog.csdn.net/weixin_43577616/article/details/120889646

qt下载

视频中推荐5.11.1版本,选择相应的系统安装包。
例如 windows为exe,mac为dmg,linux为run

注册账号密码进行安装,安装路径不能有中文。
选择安装组件

在这里插入图片描述
组件有对应的联系配置
视频中勾选了mingw , android x86,android armv7
勾选 qt visual keyboard, qt script
tools中qt creater 4.6.2,第二个mingw

打开qt creater

创建cpp工程

pro文件为配置文件

制作简单qt界面

qt工程创建,application
在这里插入图片描述
在这里插入图片描述
工程文件分析
在这里插入图片描述

ui界面

在这里插入图片描述

点击forms,双击ui文件,就可以进入ui编辑器

ui面编辑板
q label
q line edit echo mode
push button

直接编译,编译成功后直接弹出界面

qt信号和槽

1 为了方便分析代码,给相应的控件改名
2 信号就是 相应控件发出的特定信号
帮助 索引 查找 pushbutton

槽就是函数的意思,把槽函数绑定在一个控件的信号上

3 关联槽和信号
一个按钮关联槽函数

自动关联,手动选择相应空间,右键转到槽
他会现在widget.h里面声明槽函数
槽函数只能声明到private slots或者public里面

widget.cpp内实现槽函数

手动关联

使用connect函数,需要和自动一样在h文件里声明该函数( logoBt_clicked_clots() )
在这里插入图片描述
connect当对象a发出b信号时候就会出发c引起d

给界面增加图片

1 class工程文件夹添加文件
qt – qt resource file ------ 文件名为 pic.qrc

2 把图片添加到工程下
pic.qrc 右键 open with 资源编辑器

3 修改前缀
ctrl + s 保存, 添加—添加文件,选中图片

4 引用这个图片,打开ui界面。拖入label,删除文字,改变样式表。
添加资源,选中图片
在这里插入图片描述

5 添加文字,加入label,同样可以为相应的按钮增加图片
在这里插入图片描述

6 图标下载 easyicon

界面布局

qt下有三种布局,在工具栏上方,企鹅最小尺寸设置
1 水平布局
2 垂直布局
3 栅格布局

选中所有垂直布局
栅格布局

界面也会随着放大缩小变换

放置horizontal spacer
在这里插入图片描述

布局不会影响代码

界面切换

1 创建1个新的ui界面
2 工程class添加新文件, qt 设计师界面类, 选择 weigdt
3 设计新的界面,将其界面大小与之前的设计为一样
4 添加多个按钮和 图片
在这里插入图片描述

设置弹簧 水平布局
在这里插入图片描述

更改代码

在 widget.cpp文件中,加入新的设置代码

1 加入头文件
include “ctrl。h”
在这里插入图片描述

登录触发代码,进入到新的窗口

设置返回代码
转到槽
在这里插入图片描述
相当于关闭窗口

验证账号密码

在相应的登录接口中添加代码


Void Widget::logoBt_clicked_slots()
{
	QString unsename = ui->userEdit->text();
	QString passwad  =  ui->passwdEdit->text();

	if(userName=="123" && passwad=="xxx")
	{	ctrl *ct = new ctrl;
	ct->setGeometry(this->geometry());
	ct->show();
	}

	ctrl *ct = new ctrl;
	ct->setGeometry(this->geometry());
	ct->show();

}

qt的三驾马车

1 串口编程
2 网络编程
3 qt下的GPIO

串口助手

1 新建工程 qt widget工程

在这里插入图片描述

做好ui界面

实现逻辑功能
接收框使用 plain text edit,设置read only
相应的下拉候选框 combo box 以及label
发送框 line edit
按钮 pushbutton
groupbox 容器 用于广告文字显示
label设置最小大小,栅格布局
在这里插入图片描述
在这里插入图片描述

为下拉框加入属性信息

选中拉框框 双击 直接编辑,通过 + 号添加,以及通过 上下 调整位置

要对 整体复选框和label 进行删格排列,否则会整齐大小不一

需要对相应复选框设置常用默认值,
选中相应目标,在右侧设置一栏设置
在这里插入图片描述

串口号栏设置

在这里插入图片描述
将 下拉框 名称设置为 seialCb

相应的波特率,数据为,停止位等都设置名字
相应的按钮以及发送接收框也是

进一步配置

在seial.pro里配置代码

添加模块
QT  += core gui serialport

接着在 widget.cpp内
添加头文件
#include <QSerialPortInfo>

在这里插入图片描述

添加了 qstringlist 以及 foreach查找端口名并加入string list 然后把 端口名给到ui的seialcb输出

串口实现逻辑功能

在widget.h中设置
添加头文件

#include <QSerialPort>

在这里插入图片描述

在widget.cpp中设置
在这里插入图片描述
建立一个串口对象,将外部传入的this指针作为参数进行初始化

初始化串口, 利用打开按钮 触发串口打开,这用到信号槽

两种方式 1 connect函数 2 右键 转到槽

在这里插入图片描述

widget.cpp中
在槽函数中设置
在这里插入图片描述
在这里插入图片描述
在下面

if(ui->baundrateCb ->currentText() == "4800"){

	baudRate = QSerialPort::Baud4800;
}
else if(ui->baundrateCb ->currentText() == "9600")
{}
else if(ui->baundrateCb ->currentText() == "115200")
{}

在这里插入图片描述
在这里插入图片描述
报错,应该是SetPortName
这里往下添加

需要头文件 #include<QMessageBox>
if(serialPort->open(QIODevice::ReadWrite) == true)
{
	QMessageBox::information(this,"提示""chenggong");
}else{
	QMessageBox::critical(this,"提示","失败");
}

关闭功能

在这里插入图片描述

接收功能

在相应位置    foreach前面加入
connect(serialPort, SIGNAL(),this,SLOT());
可查找serialport有哪些信号
connect(serialPort, SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Slot()));
当串口有东西可读就会触发槽函数,把读到的buf显示到ui框中


在widget.h中声明槽函数
在 private slots下
void serialPortReadyRead_Slot();

在widget。cpp中实现,添加头文件 #include<Qstring>
void serialPortReadyRead_Slot()
{
	QString buf;
	buf = QString(serialPort->readAll());    他这里serial 还是 serila有点分不清了
	ui->recvEdit->appendPlainText(buf);

}

发送功能 和 清空功能

发送按钮右键转到槽,关联clicked()
在widget.cpp中

类内声明,类外实现
void Widget::on_sendBt_clicked()
{
	serilaPort->write(ui->sendEdit->text().toLocal8Bit().date());	
}


在这里插入图片描述

Q_OBJECT

Q_OBJECT 是 Qt 宏定义中的关键字之一,用于启用 Qt 的元对象特性。元对象特性是一种 Qt 框架提供的机制,可以实现以下功能:

  • 对象的动态属性(通过 Q_PROPERTY 宏定义)
  • 信号和槽机制(通过 signals 和 slots 关键字)
  • 静态元对象信息(通过 metaObject() 函数)

在使用上述特性时,需要在类的声明中添加 Q_OBJECT 宏,以便 Qt 编译器能够将该类转换为元对象。当程序运行时,Qt 框架会为每个具有 Q_OBJECT 宏的类创建一个元对象,其中包含类的静态元信息,如类名、信号的名称和参数、槽的名称和参数、以及动态属性的名称和类型等。

需要注意的是,当添加或修改 Q_OBJECT 宏后,需要运行 Qt 的元对象编译器(MOC)来生成相应的源代码文件。这是因为,在 Qt 框架中,信号和槽机制是通过 MOC 来实现的,而 MOC 只会处理包含 Q_OBJECT 宏的头文件。

总之,Q_OBJECT 宏是使用 Qt 元对象特性的必要条件之一,它可以让开发者更加方便地使用 Qt 框架的众多特性,并且可以使用 Qt Creator 等集成开发环境自动为代码生成 MOC 处理后的代码文件。

宏定义

宏定义(Macro Definition)是一种预处理指令,用于将一个标识符或代码片段替换为指定的文本。在C、C++、Objective-C等编程语言中,宏定义可以通过 #define 关键字来创建。

宏定义的基本语法如下:

#define 宏名 子串

其中,宏名是要定义的标识符,子串则是用于替换宏名的文本或代码片段。当程序中出现宏名时,编译器会将其替换为子串,并在编译之前进行预处理。

例如,以下代码定义了一个宏 MAX,表示取两个值的最大值:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

当程序中出现 MAX(a, b) 时,编译器会将其替换为 ((a) > (b) ? (a) : (b)),并在编译之前进行预处理。因此,下面的代码:

int x = 10, y = 20;
int z = MAX(x, y);

会被替换为:

int x = 10, y = 20;
int z = ((x) > (y) ? (x) : (y));

需要注意的是,宏定义虽然提供了一种方便的代码重用和简化代码的方式,但也存在一些潜在的问题。例如,宏定义可能会导致代码可读性差、类型错误和命名冲突等问题,因此在使用宏定义时需要谨慎,并根据实际需求选择最合适的方式来实现代码复用和简化。

explicit

explicit 是 C++ 中的关键字之一,用于声明单个参数的构造函数或转换函数时,表示该构造函数或转换函数只能显式调用,不能隐式调用。

例如,以下代码定义了一个类 A,其中包含一个 int 类型的成员变量:

class A {
public:
    explicit A(int n) : m_n(n) {}
private:
    int m_n;
};

在上述代码中,A 类定义了一个带有一个 int 类型参数的构造函数,并将其声明为 explicit。这意味着,当使用以下语句创建 A 类对象时,

A obj = 10;

编译器会报错,因为这里使用了隐式转换,而 explicit 声明的构造函数只能显式调用。正确的写法是:

A obj(10);

需要注意的是,当一个构造函数被声明为 explicit 时,在使用该构造函数进行显式初始化时,不需要加上额外的括号或其他语法符号,可以直接使用构造函数的参数来进行初始化。例如:

A obj = A(10); // 等价于 A obj(10)

总之,explicit 关键字可以避免编译器进行隐式类型转换,从而提高代码的可读性和安全性。在设计类的接口时,如果某个单参数构造函数或类型转换函数应该被限制为显式调用,则可以使用 explicit 来进行声明。

private slots

private slots 是 Qt 中的关键字,用于声明一个私有槽函数。槽函数与普通的成员函数类似,是一种响应特定信号的函数,用于处理与信号相关的事件。槽函数可以被信号连接调用,从而执行一些特定的操作。

在 Qt 中,槽函数分为两种类型:公共槽(public slots)和私有槽(private slots)。公共槽可以被任何代码调用和连接信号,因此通常用于界面控件的操作和通信功能的实现。而私有槽只能被类内部的其它函数或代码调用,不能被连接到信号,因此通常用于实现部分内部逻辑和细节的处理。

使用 private slots 关键字可以将槽函数设置为私有的,从而限制调用者和外部代码对其的访问。例如:

class MyClass : public QObject {
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);
private:
    void myPrivateSlot();
private slots:
    void myPrivateSlot2();
};

在上述代码中,MyClass 类定义了两个私有槽函数 myPrivateSlot() 和 myPrivateSlot2()。前者是普通的私有函数,只能由 MyClass 类内部的其它成员函数调用;后者则被声明为 private slots,既可以被 MyClass 内部的其它成员函数调用,也可以被连接到信号。不过,由于其被声明为私有槽,因此外部代码无法使用 myPrivateSlot2() 函数。

需要注意的是,使用槽函数时必须先声明 Q_OBJECT 宏,以启用 Qt 的元对象系统支持,从而能够在运行时实现信号和槽之间的连接。

打包为windows软件

因为要把写好的程序发给用户来用
源码也不是随便给别人

怎么打包和部署,把工程切换到release模式
在这里插入图片描述

release模式: 基本没有调试信息
debug 有很多调试信息

2 找到release模式下 编译构建的文件夹

3 改一下图标。
注意 图标格式必须为 .ico这个格式,其他不行
在这里插入图片描述
直接在pro文件中,写上
RC_ICONS = serial_icon.ico
把图标添加到工程目录下

4 编译后图标就变了
在这里插入图片描述

封包操作 需要用到qt的控制台

window菜单栏里直接搜 qt, 出现终端。
使用qt控制台。

需要在电脑桌面张创建一个新的文件夹,不能有中文路径,然后
把工程里的exe文件放到该文件夹下。

qt控制台内进入到 文件夹的路径下。
cd /d 路径
dir
在这里插入图片描述

执行指令
windeployqt serial.exe
使用windeployqt工具把我们新创建的exe文件自动配置
在这里插入图片描述
自此就有一个正常的exe可执行文件了

exe需要相应的动态依赖库才能执行

是的,通常情况下,通过编译生成的可执行文件(.exe文件)在运行时需要相应依赖的动态链接库(DLL文件)才能正常运行。

这是因为,在编译程序时,编译器将程序所依赖的外部函数和库的引用链接到可执行文件中。对于静态链接库(.lib文件),编译器将链接库的目标代码直接嵌入可执行文件中,从而使得可执行文件在运行时不再依赖该链接库;而对于动态链接库(.dll文件),编译器只将链接库的引用信息嵌入到可执行文件中,而不包含链接库的实际目标代码。因此,在运行可执行文件时需要动态加载并使用相应的动态链接库。

如果没有安装或正确配置相应的动态链接库,那么在运行可执行文件时就会出现找不到符号或无法加载 DLL 等错误,导致程序无法正常运行。为了避免这种问题,通常建议将程序所需的 DLL 文件一起打包,或者在程序运行前确保相应的 DLL 文件已经存在并设置好了可以被搜索到的路径。

在 Windows 系统中,可以使用工具如 Dependency Walker 来查看可执行文件的依赖关系,并确定程序所需的 DLL 文件。同时,也可以使用某些工具或方法来打包 DLL 文件,或在程序中动态加载和释放 DLL 文件,以提高程序的兼容性和可移植性。

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

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

相关文章

力扣动态规划专题(四)劫舍问题与股票问题 打家劫舍Ⅰ Ⅱ Ⅲ 买卖股票最佳时机Ⅰ Ⅱ Ⅲ IV 步骤及C++实现

文章目录 198. 打家劫舍213. 打家劫舍 II337. 打家劫舍 III121. 买卖股票的最佳时机动态规划贪心算法 122. 买卖股票的最佳时机 II动态规划贪心算法 123.买卖股票的最佳时机III188.买卖股票的最佳时机IV309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费 198. 打家劫…

为摸鱼助力:一份Vue3的生成式ElementPlus表单组件

目录 一、实现背景 二、简介 三、组织架构设计 四、实现方式 五、代码示例 六、示例代码效果预览 七、项目预览地址 & 项目源码地址 目前项目还有诸多待完善的地方&#xff0c;大家有好的想法、建议、意见等欢迎再次评论&#xff0c;或于github提交Issues 一、实现…

杭州市等级保护测评机构名录-2023年

等级保护测评机构并不是一成不变的&#xff0c;因为有年审不符合条件被撤销的&#xff0c;也有符合条件新增的&#xff0c;所以需要不定时查看的。这里小编就给大家汇总了2023年杭州市等级保护测评机构名录。 杭州市等级保护测评机构名录-2023年 序号&#xff1a;1 机构名称…

开源SCRM营销平台MarketGo-营销通道

一、概述 互联网逐步由蓝海市场往红海市场走&#xff0c;互联网增量的红利基本到顶了。营销层面过去要获取新用户&#xff0c;现在需要考虑用户的留存、活跃、复购等&#xff0c;重心从拉新向留存用户的精细化运营转移&#xff1b;当人口红利慢慢消失&#xff0c;成本也在逐渐…

零基础学会Python编程——开发环境的搭建

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 学习目标 一.python 介绍 1.Python 的历史 2.Python 的应用领域 二.Pytho…

电源开关这个丨和0哪个在上方?

开关这个丨和0哪个在上方&#xff1f; 开关的I或O的位置&#xff0c;根据安装的方向不同而不同。一般情况下上下方向安装时&#xff0c;都是O在上面。而水平安装时则是左O右I。 开关图片 在这种类型的开关中&#xff0c;是将“|”和“O”作为一个电源开闭循环的标示&#xff0…

PtaPython练习

一、3位水仙花数计算 1、题目 3位水仙花数”是指一个三位整数&#xff0c;其各位数字的3次方和等于该数本身。例如&#xff1a;ABC是一个“3位水仙花数”&#xff0c;则&#xff1a;A的3次方&#xff0b;B的3次方&#xff0b;C的3次方 ABC。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬…

《面试1v1》Spring循环依赖

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利

随着 WEB领域的快速发展 3D技术开始不再是桌面应用的专利 WEB3D技术的应用 实现了启用网址的3维呈现 让界面更直观 立体的展示 他打破了传统平面的展示形式 那么 目前的话 政府也有大量的新基建的项目 如 数字孪生 智慧城市 智慧园区 智慧工厂 智慧消费等等项目都涉及到了 3D…

系统磁盘从MBR格式转换成GPT格式来升级win11

之前的《用移动硬盘当系统盘&#xff0c;即插即用》中说到&#xff0c;需要把磁盘格式转化为MBR格式才能执行下去。问题是&#xff0c;win10升级win11要求启动方式为UEFI的话&#xff0c;磁盘格式不能为MBR。其实不升级也不影响啥&#xff0c;但是就是想好看点。所以花了点时间…

推荐系统学习

推荐系统 系统职能&#xff1a;头条/抖音/快手&#xff0c;都是以推荐系统作为流量的分发的主要手段&#xff1b; 职业发展&#xff1a;大数据处理/流式计算/数据挖掘/机器学习/高并发服务等领域。 更具用户的离十信息和行为&#xff0c;向用户推荐他感兴趣的内容 基于行为的…

Modbus TCP 协议详解及C语言示例

Modbus TCP 是一种应用于以太网的通讯协议&#xff0c;基于Modbus RTU协议。Modbus协议是一种应用于串行数据通信的协议&#xff0c;广泛应用于工业控制系统。Modbus TCP 将传统的 Modbus RTU 消息封装在 TCP/IP 报文中&#xff0c;使其能够在现代的以太网环境中进行通信。本文…

VUE 2X MVVM模型 ③

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs M V V M MVVM MVVM模型Data与El的2种写法总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ ⡖⠒⠒⠒…

【数据分享】1929-2022年全球站点的逐年平均风速(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

linux-7 awk

目录 1.awk默认规则 2.处理方式 3.格式 4.运算 5.getline 6. 文件内容匹配过滤打印 7.begin . end模式 8.awk条件判断打印 9.awk三元表达 10.awk精准筛选 11.awk数组 1.awk默认规则 当以多空格为分隔符时 自动压缩成一个 默认操作就是打印 默认分隔符时空格 2.处理…

解锁Gradio Interface的便捷与扩展性:load、from_pipeline、integrate和queue方法的魔力

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Day25 实战篇 ——Jmeter实现Java测试实战

Day25 实战篇 ——Jmeter实现Java测试实战 文章目录 Day25 实战篇 ——Jmeter实现Java测试实战一、新建Maven项目二、编写输入参数类、测试类三、编译、打包四、验证开发的函数是否正常1、性能测试过程中,有时候开发想对JAVA代码进行性能测试,Jmeter是支持对Java请求进行性能…

论文解读In-Depth Mouse: Integrating Desktop Mouse into Virtual Reality

In-Depth Mouse: Integrating Desktop Mouse into Virtual Reality HCI2022 honorable ❤️ 将2d的鼠标应用到3d的虚拟空间中&#xff0c;对可选对象进行选择 Challenge 1、如果单纯利用3d虚拟鼠标的3d位置对可选物体进行选择&#xff0c;有可能出现距离更近的物体将虚拟鼠标…

技术讨论:我心中TOP1的编程语言

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

JAVA实现问财爬虫

通过 RestTemplate 将查询语句申请发送至问财&#xff0c;实现同花顺问财的爬虫获取数据&#xff0c;例子中实现了将爬取的数据写入excel文件并染成红色&#xff0c;可将其改造放入数据库中. 通过测试发现爬虫自动能访问一百多次左右&#xff0c;会被官方识别为爬虫&#xff0c…