【Qt安装与简易串口控制Arduino开发板小灯教程】

【Qt安装与简易串口控制Arduino开发板小灯教程】

  • 1. 前言
  • 2. QT环境搭建
  • 3. 验证QT_Creator是否安装成功
    • 3.1 设计流程
    • 3. 2 上位机界面设计
  • 4. 上位机逻辑代码编写
    • 4.1 添加串口库、包含串口相关头文件
    • 4.2 添加QSerialPort成员
    • 4.3 创建串口对象、搜索所有可用串口
    • 4.4 在`编写“打开串口”槽函数
    • 4.5 编写“关闭串口”、“点灯”、“灭灯”槽函数
    • 4.6 源码分享
  • 5. 添加上位机图标
    • 5.1 图标下载网址
    • 5.2 ico转换
  • 6. 上位机程序打包
  • 7. 上位机测试验证
  • 5. 总结

在这里插入图片描述

1. 前言

我们本次实现的上位机的功能很简单:上位机通过串口来控制开发板上的一个LED的亮灭。界面如:

在这里插入图片描述

2. QT环境搭建

在着手编写上位机程序之前,让我们先搭建QT开发环境。我们将直接使用QT Creator,这是一个专为跨平台Qt开发设计的轻量级集成开发环境(IDE)。它不仅为初学者提供了易于上手的界面,还确保了开发人员能够快速掌握Qt框架。即使您不打算开发Qt应用程序,Qt Creator也是一个功能强大且易于使用的IDE。接下来,我们将一起进行Qt Creator的安装。

1、注册qt账号
我们需要先注册一个QT账号,后面安装Qt Creator的时候会用到。注册账号的地址为:

https://www.qt.io/zh-cn/product/development-tools

在这里插入图片描述

2、下载QT_Creator并安装
我们在Windows上进行开发,安装Windows版本的Qt Creator。下载地址:

  1. https://download.qt.io/new_archive/qt/5.12/5.12.12/

  2. 网盘下载链接:https://pan.baidu.com/s/1J1hK8ZVdBHBt-KClL8bSKw
    提取码:zj65

下载得到qt-opensource-windows-x86-5.12.12.exe。然后双击安装,
在这里插入图片描述
第二步需要输入账号密码,把我们上面注册好的账号密码填入即可。
在这里插入图片描述

勾选阅读条款,输入uplooking,点击下一步next

在这里插入图片描述
点击下一步next
在这里插入图片描述
换一下安装位置,不建议C盘安装,点击下一步next
在这里插入图片描述
一定要注意下面4个组件的安装勾选,MinGW7.3.0 32-bit是提供GCC编译环境,Source是QT源码包,QT chart & data 是项目需要的功能包(推荐大家安装Qt Chart)。点击下一步next
在这里插入图片描述
勾选许可证,点击下一步next
在这里插入图片描述
点击下一步next
在这里插入图片描述
点击安装install
在这里插入图片描述
安装需要10分钟左右,接下来需要配置一下MinGW的环境变量
在搜索菜单中输入path,点击编辑环境变量
在这里插入图片描述
为系统变量添加MinGW三个路径。两个bin,一个lib
在这里插入图片描述
采用系统终端检查gcc环境(gcc -v)
在这里插入图片描述

3. 验证QT_Creator是否安装成功

我们创建一个简单的C++工程来验证一下Qt Creator是否安装成功。

3.1 设计流程

Qt Creator搭建好之后我们接下来开始编写我们的上位机。

编写这个简单的上位机我们需要经过一下几个步骤:

  1. 上位机界面设计;
  2. 上位机逻辑代码编写;
  3. 添加上位机图标;
  4. 上位机程序的打包;
  5. 上位机测试验证。

另外,QT中有三种基类,这里我们选择QWidget类。QT的三个基类如:

  • QMainWindow类:提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。
  • QWidget类:所有用户界面对象的基类,窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标,键盘和其他消息,并在屏幕上绘制自己。
  • QDialog类:对话框窗口的基类,对话框窗口主要用于短期任务和用户进行短期通讯的顶级窗口,QDialog可以是模态对话框或者是非模态对话框。

其中,项目文件.pro文件是用来告诉qmake关于为这个应用程序创建makefile所需要的细节。例如,一个源文件和头文件的列表、任何应用程序特定配置。例如,一个必需链接的额外库或者一个额外的包含路径、都应该放到项目文件中。

3. 2 上位机界面设计

Qt 一个可视化的界面设计工具:Qt 设计器(Qt Designer)。我们双击.ui文件就可以进入Qt Designer,在Qt Designer中我们可以通过拖动控件的方式来设计我们的界面,整个界面如:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们从左侧的控件区把我们需要的控件拖动到界面编辑区中,我们这个简单地上位机用到的控件如:
在这里插入图片描述

这里需要注意的是波特率这个下拉框需要双击设置一些备选配置,如波特率设置选项,串口是自动获取的不需要设置:

在这里插入图片描述

大家可以在左边地控件区找到这三种控件拖动到界面编辑器进行修改、布局即可。
其中,布局可通过如下组件调整:
在这里插入图片描述

这几个组件的功能如:

布局组件功能
Vertical Layout垂直方向布局,组件自动在垂直方向上分布
Horizontal Layout水平方向布局,组件自动在水平方向上分布
Grid Layout网格状布局,网状布局大小改变时,每个网格的大小都改变
Form Layout窗体布局,与网格状布局类似,但是只有最右侧的一列网格会改变大小
Horizontal Spacer一个用于水平分隔的空格
Vertical Spacer一个用于垂直分隔的空格

具体地用法大家可以自己去实操一下。

另外,我们需要给我们使用的控件重新命名,在右侧的对象管理区进行操作。命名为有意义的名字,因为后面编写代码会用到。有意义的名字利于编写易懂的代码,这边控件名称一定要与代码调用的一一对应。比如我们修改的名字如:
在这里插入图片描述

最后,控件的属性可根据需要在属性区进行调整。

4. 上位机逻辑代码编写

4.1 添加串口库、包含串口相关头文件

在Serial_app.pro文件添加串口库:

QT       += core gui serialport

在这里插入图片描述

在mainwindow.h文件包含串口头文件:
在这里插入图片描述

#include <QSerialPort>
#include <QSerialPortInfo>

QSerialPort 类提供了操作串口的各种接口。

QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。

4.2 添加QSerialPort成员

mainwindow.h的MainWindow类中添加一个QSerialPort成员:

在这里插入图片描述

QSerialPort *serialPort;

4.3 创建串口对象、搜索所有可用串口

MainWindow构造函数中创建一个串口对象并搜索所有可用串口:

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{QStringList serialNamePort;ui->setupUi(this);this->setWindowTitle("Serial_app");/* 创建一个串口对象 */serialPort = new QSerialPort(this);/* 搜索所有可用串口 */foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {serialNamePort<<inf0.portName();}ui->Serial_box->addItems(serialNamePort);
}
    ​​​​​​​        ​​​​​​​        

4.4 在`编写“打开串口”槽函数

在这里插入图片描述

信号和槽是用于对象之间的通信,它是Qt的核心机制。
在这里插入图片描述

在这里插入图片描述

当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。如果有对象对这个信号感兴趣,想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。

这里,我们点击打开串口按钮会发出clicked信号,此时对应槽函数on_Open_serial_clicked会被调用。下面我们来实现这个槽函数:


void MainWindow::on_Open_serial_clicked()
{/* 串口设置 */serialPort->setPortName(ui->Serial_box->currentText());serialPort->setBaudRate(ui->Baudrate_box->currentText().toInt());serialPort->setDataBits(QSerialPort::Data8);serialPort->setStopBits(QSerialPort::OneStop);serialPort->setParity(QSerialPort::NoParity);/* 打开串口提示框 */if (true == serialPort->open(QIODevice::ReadWrite)){QMessageBox::information(this, "提示", "串口打开成功");}else{QMessageBox::critical(this, "提示", "串口打开失败");}
}

这里我们写死数据位、停止位、求校验位;增加提示框。其中使用QMessageBox需要包含如下头文件:

#include <QMessageBox>

4.5 编写“关闭串口”、“点灯”、“灭灯”槽函数

按照上面打开串口槽函数的方法编写关闭串口、点灯、灭灯槽函数:

void MainWindow::on_Close_serial_clicked()
{QMessageBox::information(this, "提示", "串口关闭成功");
}void MainWindow::on_Turn_on_clicked()
{serialPort->write("ON\n");qDebug("ON\n");
}void MainWindow::on_Turn_off_clicked()
{serialPort->write("OFF\n");qDebug("OFF\n");
}

以上就是上位机逻辑代码的编写。

4.6 源码分享

文件目录分享
在这里插入图片描述

  1. Serial_app.pro
# Automatically generate .qm files out of .ts files in TRANSLATIONS and
# EXTRA_TRANSLATIONS.
#
# If embed_translations is enabled, the generated .qm files are made available
# in the resource system under :/i18n/.
#
# Otherwise, the .qm files are available in the build directory in LRELEASE_DIR.
# They can also be automatically installed by setting QM_FILES_INSTALL_PATH.qtPrepareTool(QMAKE_LRELEASE, lrelease)isEmpty(LRELEASE_DIR): LRELEASE_DIR = .qm
isEmpty(QM_FILES_RESOURCE_PREFIX): QM_FILES_RESOURCE_PREFIX = i18nlrelease.name = lrelease
lrelease.input = TRANSLATIONS EXTRA_TRANSLATIONS
lrelease.output = $$LRELEASE_DIR/${QMAKE_FILE_IN_BASE}.qm
lrelease.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} $$QMAKE_LRELEASE_FLAGS -qm ${QMAKE_FILE_OUT}
silent: lrelease.commands = @echo lrelease ${QMAKE_FILE_IN} && $$lrelease.commands
lrelease.CONFIG = no_link
QMAKE_EXTRA_COMPILERS += lreleaseall_translations = $$TRANSLATIONS $$EXTRA_TRANSLATIONS
for (translation, all_translations) {# mirrors $$LRELEASE_DIR/${QMAKE_FILE_IN_BASE}.qm abovetranslation = $$basename(translation)QM_FILES += $$OUT_PWD/$$LRELEASE_DIR/$$replace(translation, \\..*$, .qm)
}
embed_translations {qmake_qm_files.files = $$QM_FILESqmake_qm_files.base = $$OUT_PWD/$$LRELEASE_DIRqmake_qm_files.prefix = $$QM_FILES_RESOURCE_PREFIXRESOURCES += qmake_qm_files
} else {!isEmpty(QM_FILES_INSTALL_PATH) {qm_files.files = $$QM_FILESqm_files.path = $$QM_FILES_INSTALL_PATHINSTALLS += qm_files}lrelease.CONFIG += target_predeps no_clean
}
  1. mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_Open_serial_clicked();void on_Close_serial_clicked();void on_Turn_on_clicked();void on_Turn_off_clicked();private:Ui::MainWindow *ui;QSerialPort *serialPort;
};
#endif // MAINWINDOW_H
  1. main.cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_Open_serial_clicked();void on_Close_serial_clicked();void on_Turn_on_clicked();void on_Turn_off_clicked();private:Ui::MainWindow *ui;QSerialPort *serialPort;
};
#endif // MAINWINDOW_H
  1. mainwindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{QStringList serialNamePort;ui->setupUi(this);this->setWindowTitle("Serial_app");/* 创建一个串口对象 */serialPort = new QSerialPort(this);/* 搜索所有可用串口 */foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {serialNamePort<<inf0.portName();}ui->Serial_box->addItems(serialNamePort);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_Open_serial_clicked()
{/* 串口设置 */serialPort->setPortName(ui->Serial_box->currentText());serialPort->setBaudRate(ui->Baudrate_box->currentText().toInt());serialPort->setDataBits(QSerialPort::Data8);serialPort->setStopBits(QSerialPort::OneStop);serialPort->setParity(QSerialPort::NoParity);/* 打开串口提示框 */if (true == serialPort->open(QIODevice::ReadWrite)){QMessageBox::information(this, "提示", "串口打开成功");}else{QMessageBox::critical(this, "提示", "串口打开失败");}
}void MainWindow::on_Close_serial_clicked()
{QMessageBox::information(this, "提示", "串口关闭成功");
}void MainWindow::on_Turn_on_clicked()
{serialPort->write("ON\n");qDebug("ON\n");
}void MainWindow::on_Turn_off_clicked()
{serialPort->write("OFF\n");qDebug("OFF\n");
}
  1. Serial_app_zh_CN.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN"></TS>
  1. mainwindows.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>390</width><height>238</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="widget"><property name="minimumSize"><size><width>307</width><height>238</height></size></property><widget class="QWidget" name="gridLayoutWidget_2"><property name="geometry"><rect><x>20</x><y>20</y><width>399</width><height>134</height></rect></property><layout class="QGridLayout" name="gridLayout_3"><item row="0" column="0"><layout class="QGridLayout" name="gridLayout"><item row="2" column="0"><widget class="QComboBox" name="Serial_box"/></item><item row="0" column="0"><widget class="QLabel" name="Serial_label"><property name="text"><string>串口</string></property></widget></item><item row="3" column="0"><widget class="QLabel" name="Baudrate_label"><property name="text"><string>波特率</string></property></widget></item><item row="5" column="0"><widget class="QComboBox" name="Baudrate_box"><item><property name="text"><string>9600</string></property></item><item><property name="text"><string>115200</string></property></item></widget></item><item row="6" column="0"><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QPushButton" name="Turn_off"><property name="text"><string>关灯</string></property></widget></item><item><widget class="QPushButton" name="Turn_on"><property name="text"><string>开灯</string></property></widget></item><item><widget class="QPushButton" name="Close_serial"><property name="text"><string>关闭串口</string></property></widget></item><item><widget class="QPushButton" name="Open_serial"><property name="text"><string>打开串口</string></property></widget></item></layout></item></layout></item></layout></widget></widget></widget><resources/><connections/>
</ui>

5. 添加上位机图标

5.1 图标下载网址

在网上找一个相关的.ico后缀的图标下载放到我们的工程路径下,
如:https://www.iconfont.cn/

在这里插入图片描述

在这里插入图片描述

5.2 ico转换

网站地址:https://www.ico51.cn/
在这里插入图片描述
复制ico文件到qt项目中,注意名称引用一致性

在这里插入图片描述

然后在我们的Serial_app.pro文件中添加如下一行代码:

RC_ICONS += \Serial_app.ico

在这里插入图片描述

6. 上位机程序打包

我们上面运行的上位机都是在Qt Creator中编译运行的,如果我们需要把编写好的可执行文件发送给别人使用的话还需要进行打包。上面我们的工程是Debug版本的:

在这里插入图片描述
打包之前,我们先把工程修改为Release版本:

在这里插入图片描述

然后在我们工程目录下得到:

在这里插入图片描述

此时,双击release文件夹下的serial_led.exe文件是会报错的,报错原因是找不到一些相关的动态库:

在这里插入图片描述

我们新建一个文件夹保存我们的打包文件Serial_app_packet,如:
在这里插入图片描述

把build-serial_led-Desktop_Qt_5_11_1_MinGW_32bit-Release\release路径下的serial_led.exe文件拷贝至serial_led_packet文件夹中:
在这里插入图片描述

打开QT for Disktop工具:

在这里插入图片描述

执行如下命令进入打包目录:

cd /d E:\Qt\example\Serial_app_packet

然后执行如下命令进行打包:

windeployqt Serial_app.exe

在这里插入图片描述

此时,serial_led_packet文件夹中的serial_led.exe文件就可以双击运行了,注意要插上串口模块,这样才可以测试:

在这里插入图片描述

此时就完成了程序的打包。此时我们把这一整个文件夹压缩发送给别人使用了。另外,我们也可以借助一些工具把这些文件打包成一个整体的.exe文件,这里不再介绍。

7. 上位机测试验证

我们点击上位机的点灯、灭灯按钮,则会通过串口分别发送ON\n、OFF\n,我们编写下位机代码进行接收,然后操控LED灯即可。
下面给出Arduino Uno开发板的程序

const int ledPin = 13; // LED连接到数字引脚13
const int serialBaudRate = 9600; // 设置串口波特率void setup() {pinMode(ledPin, OUTPUT); // 设置LED引脚为输出模式Serial.begin(serialBaudRate); // 初始化串口通信
}void loop() {if (Serial.available() > 0) { // 检查串口是否有数据可读String receivedData = Serial.readStringUntil('\n'); // 读取串口数据直到换行符if (receivedData == "ON") {digitalWrite(ledPin, HIGH); // 打开LED灯} else if (receivedData == "OFF") {digitalWrite(ledPin, LOW); // 关闭LED灯}}
}

大家根据需求修改代码,就可完成Serial_app应用控制Arduino Uno板载LED灯啦!😊😊😊

5. 总结

🥳🥳🥳现在,我们在本教程中,您学习了Qt安装与简易串口控制Arduino开发板小灯教程。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

如果你有任何问题,可以通过下面的二维码加入鹏鹏小分队,期待与你思维的碰撞😘😘😘

参考文献:

  1. 用Qt写一个上位机(完整版)

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

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

相关文章

微软成为PostgreSQL主要贡献者

微软对PostgreSQL贡献的很多新功能都来自于客户在使用微软Azure上的PostgreSQL管理实例数据库&#xff0c;所以这些新功能都来自于真实的客户需求 微软贡献的这些新功能都是比较实用的功能 在这里&#xff0c;【真实的客户需求】要突出一下&#xff0c;因为现在很多社区贡献者…

4. docker镜像、Dockerfile

docker镜像、Dockerfile 一、docker镜像1、镜像介绍2、镜像核心技术 二、Dockerfile定制镜像1、Dockerfile使用流程1.1 编写Dockerfile1.2、构建镜像1.3 创建容器测试镜像定制操作 2、Dockerfile常用指令 一、docker镜像 1、镜像介绍 分层的文件系统 优势&#xff1a;节省空间…

基于JAVA+SpringBoot+uniapp的心理小程序(小程序版本)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、SpringCloud、Layui、Echarts图表、Nodejs、爬…

docker默认存储地址 var/lib/docker 满了,换个存储地址操作流程

1. 查看docker 存储地址 docker info如下 var/lib/docker2、查看内存大小 按需执行 df -h 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找这个文件的容量 df -h 查找所有挂载点 du -hs /home/syy_temp/*1、df -h 2、sud…

2-38 基于matlab的蚁群算法优化无人机uav巡检

基于matlab的蚁群算法优化无人机uav巡检&#xff0c;巡检位置坐标可根据需求设置&#xff0c;从基地出发&#xff0c;返回基地&#xff0c;使得路径最小。可设置蚁群数量&#xff0c;信息素系数。输出最佳路线长度。程序已调通&#xff0c;可直接运行。 2-38 蚁群算法优化无人…

科普文:多线程如何使用CPU缓存?

一、前言 计算机的基础知识聊的比较少&#xff0c;但想要更好的理解多线程以及为后续多线程的介绍做铺垫&#xff0c;所以有必要单独开一篇来聊一下 CPU cache。 二、CPU 前面有一篇文章关于 CPU是如何进行计算 感兴趣的同学&#xff0c;可以先移步了解一下&#xff0c;不了…

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster&#xff08;集群&#xff09;模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题&#xff1a;1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 1.回答&#xff1a;单机单台100%不可能&#xff0c;肯…

细说MCU用定时器控制ADC采样频率的实现方法并通过Simulink查看串口输出波形

目录 一、硬件工程 二、建立Simulink模型 1.安装MATLAB和Simulink 2.建立Simulink模型 三、代码修改 1.修改回调函数 2.产看结果 3.完整的main.c 本文作者的文章 细说MCU用定时器控制ADC采样频率的实现方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/…

270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡

一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片&#xff0c;支持PCIeX8、两组 64bit DDR3容量8GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持各种FMC子卡扩展。软件支持windows&#xff0c;Linux操作系统。 二、功能和技术指标&#xff1a; 板卡功…

Getx学习笔记之中间件鉴权

目录 前言 一、实现步骤 1.添加依赖 2.创建鉴权中间件 3.定义路由 4.设置初始路由 5.模拟登陆状态 二、Getx鉴权步骤总结 三、本文demo示例 四、参考文章 前言 在 Flutter 中&#xff0c;使用 GetX 可以很方便地实现中间件鉴权&#xff08;Authentication&#xff09…

MySQL生产环境迁移至YashanDB数据库深度体验

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《MySQL生产环境迁移至YashanDB数据库深度体验》&#xff08;作者&#xff1a;呆呆的私房菜&#xff09;&#xff0c;满满…

Python简化命令行界面库之fire使用详解

概要 在开发命令行工具时,开发者通常需要编写大量代码来解析命令行参数,这既耗时又容易出错。Python Fire 是 Google 开源的一个库,旨在简化命令行界面的开发。它可以将任何 Python 对象自动生成一个命令行界面,从而大大减少了开发时间和代码复杂度。本文将详细介绍 Pytho…

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域&#xff0c;单击试用样例数据。 在更多添加数据的方式页面下方&#xff0c;单击其他样例数据集…

Vscode+Pyside6开发之虚拟环境配置以及错误解决

Pyside开发之虚拟环境配置以及错误解决 开发环境一、项目创建以及虚拟环境设置1.创建项目2. 新建py文件,新建虚拟环境3.激活虚拟环境二、项目位置改变pip命令报错1.删除原来的虚拟环境2. 产生包列表文件requirements.txt3.重新创建虚拟环境4.重新安装包文件5.其他错误开发环境…

Notepad++换安装路径之后,右键打开方式报错:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。的处理方法

把Notepad添加到右键打开方式&#xff0c;可以参考下面的3篇文章添加&#xff1a; https://blog.csdn.net/xiaoerbuyu1233/article/details/88287747 https://blog.csdn.net/qq_44000337/article/details/120277317 https://www.cnblogs.com/zhrngM/p/12899026.html 这里主要是…

谷歌浏览器自动填充密码时,el-input样式错乱

使用到谷歌浏览器的记忆功能&#xff0c;选择的内容为浏览器保存的内容时 会导致element-plus的el-input样式改变 只需要增加一个css样式&#xff0c;就可以解决问题 :deep .el-input__inner {box-shadow: 0 0 0 1000px #fff inset; }修改后

上位机图像处理和嵌入式模块部署(香橙派AI Pro开发板试用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和工控机相比较,linux嵌入式开发板使用上面方便很多、也容易很多。很多的第三方库都可以通过yum、apt-get这样的方法直接下载到,不需要自己通过源代码重新进行编译、安装。因为自…

Java基础知识之 使用 Cleaner 替代 finalize

Object.finalize 方法 在 Java 中&#xff0c;一个对象如果不再使用&#xff0c;那么它就会在 JVM 垃圾回收时&#xff0c;进行析构释放该对象占用的内存空间。但如果这个对象持有了一些其他需要进行额外处理的资源&#xff08;非堆内存资源&#xff09;&#xff0c;那么就得考…

SSR理解(vite与nuxt比较)

一、SSR的概念与理解(什么是SSR&#xff1f;) 定义:SSR是指在服务器端完成页面的渲染工作&#xff0c;将最终生成的HTML内容发送给浏览器。 简单来说&#xff0c;就是在服务器端将网页内容渲染成HTML&#xff0c;然后将这个渲染好的HTML发送到客户端&#xff0c;也就是我们的…

网络安全-等级保护制度介绍

一、等保发展历程 &#xff08;1&#xff09;1994国务院147号令 第一次提出等级保护概念&#xff0c;要求对信息系统分等级进行保护 &#xff08;2&#xff09;1999年GB17859 国家强制标准发布&#xff0c;信息系统等级保护必须遵循的法规 &#xff08;3&#xff09;2005年公安…