QT-Qt概述安装Qt创建项目常用基础部件信号和槽

1. Qt概述

  • Qt 是一个跨平台的 C++图形用户界面应用程序的开发框架。

    • 图形用户界面: GUI (Graphical User Interface)

    • 框架:别人写好的一堆类(工具包)和开发规则。使用框架开发,能够大大降低程序的开发难度,提升开发效率,节约开发成本。

    • 跨平台: 一次编写,在不同平台上无需改动(或少量改动)就可以形成在不同平台上运行的版本,例如:Windows、Linux、Mac等

  • Qt 还支持嵌入式和移动开发,例如:IOS、Android、Embedded linux和WinRT等。

  • 桌面程序 和 C/S结构的程序

Qt 发展史:

  • Qt 的前身为创始于1994年的 Trolltech(奇趣科技)

  • Trolltech 于2008年6月被 Nokia(诺基亚)收购

  • 2011年3月 Qt 被芬兰的 Digia 公司收购

Qt版本介绍:

  • Qt目前有 Qt4、Qt5、Qt6三个版本

  • Qt4.8.7 是 Qt4 的最终版本,也是 Qt4 系列中最稳定的版本,很多老项目还是会用 Qt4 进行维护

  • Qt5 是现在最常用的版本

    • Qt5.6.3 是最后支持xp系统的长期支持版本;

    • Qt5.12.3 是最后提供mysql数据库插件的版本,往后的版本需要自行编译对应的 mysql 数据库插件;

    • Qt5.12.5 是最后样式表性能最高的版本; QSS

    • Qt5.14.2 是最后提供离线安装包的版本,后面的版本都要在线安装;

    • Qt5.15 系列是最后支持 win7 的版本

  • Qt6 是最新版本,还在不断更新,解决BUG,目前不是很稳定。

2. 安装Qt

  • Qt 开发有专门的编辑器 -- Qt Creator

  • 下载地址:

  • http://download.Qt.io/archiveicon-default.png?t=O83Ahttp://download.qt.io/archive

  • 不同操作系统需要下载不同软件去安装

  • 注意事项: 安装路径中不允许有中文、空格或特殊符号

安装步骤:

  1. 双击安装程序

 2. 注册账号

链接地址:Qt Account Loginicon-default.png?t=O83Ahttps://login.qt.io/register

3. 输入Qt的账号密码(也可以跳过 勾选 I accept ...)

4. 设置安装目录

5.选择组件

6.接受协议  7.安装

3. 创建项目

1. 点击 "+ New Project" 创建新项目

2.选择模版

3.设置项目创建路径

4.选择编译器

5.类名设置

  • 首字母大写

  • 不要勾选 创建界面

  • QWidget: 空窗口

  • QMainWindow: 主窗口

  • QDialog: 对话框

6.配置版本管理软件

7.测试

4. 项目文件解析

基础项目包含了4个文件:

  • 工程文件: 01_first_project.pro

  • 头文件: MyWidget.h

  • 源文件: main.cpp MyWidget.cpp

  • 用户配置文件: 01_first_project.pro.user

工程文件: qmake自动生成的用于产生 makefile 的配置文件

# 项目需要包含的模块
Qt       += core gui# 当Qt版本大于4时,包含的模块
greaterThan(Qt_MAJOR_VERSION, 4): Qt += widgets# 产生的可执行程序(.exe) 的文件名
TARGET = 01_first_project# 程序的生成模式。 app代表生成 .exe 可执行程序, lib 代表生成 .dll 动态链接库
TEMPLATE = app# 编译选项,当项目中出现某些被标记为过时模块时,会报警
DEFINES += Qt_DEPRECATED_WARNINGSCONFIG += c++11
# 项目中包含的源文件
SOURCES += \main.cpp \Widget.cpp
# 项目中包含的头文件
HEADERS += \Widget.h# 项目部署的默认规则
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

main.cpp: 项目入口文件

#include "Widget.h"// 包含应用程序类型的头文件
#include <QApplication>// 入口函数
int main(int argc, char *argv[])
{// 实例化应用程序对象,该对象有且仅有一个QApplication a(argc, argv);// 实例化窗口对象, widget 代表空窗口Widget w;// 调用 show 方法显示创建好的空窗口w.show();// 让应用程序对象进入消息循环。 没有该方法,程序启动后马上会被销毁return a.exec();
}

MyWidget.h: 窗口类头文件

  • Widget 是系统提供的空窗口基类

  • 该头文件中,对空创建基类进行了二次封装,如果需要在创建窗口时实现额外的功能,可以在该文件中实现

#ifndef MYWIDGET_H
#define MYWIDGET_H// 包含系统提供的 QWidget 类
#include <QWidget>class Widget : public QWidget
{// Q_OBJECT宏,设置了该宏之后,就能在项目中使用 信号 和 槽Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
};#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{
}Widget::~Widget()
{}

5. Widget 空窗口

  • Widget 类的作用是创建一个空窗口

  • 该类中提供了很多方法,能够实现窗口的外观设置

#include "MyWidget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{// 设置窗口标题this->setWindowTitle("我的第一个App");// 设置窗口大小this->resize(500, 300);// 设置窗口固定大小(不能拖拽修改)this->setFixedSize(500, 300);
}

6. 常用基础部件

Qt中提供了非常多的部件,使用这些部件能够开发出图形化的用户界面

6.1 QLabel

QLabel 能够在窗口中设置文本

常用方法:

  • setText: 设置 QLabel 中要显示的文本

  • setParent: 设置父部件(显示在哪个部件中)

  • move: 设置在窗口中显示的位置

  • resize: 设置QLabel 所占的区域

  • setFont: 设置文本的字体

#include <QLabel>
#include <QFont>Widget::Widget(QWidget *parent): QWidget(parent)
{this->setWindowTitle("Hello");this->resize(500, 300);// 创建 QLabel 对象QLabel *l1 = new QLabel;// 设置文本内容l1->setText("Hello,你好啊!!!");// 设置文本显示位置l1->move(100, 100);// 设置文本区域大小l1->resize(200, 100);// 设置文本对齐方式, 默认水平左对齐 垂直中对齐l1->setAlignment(Qt::AlignHCenter | Qt::AlignTop);// 设置文本使用字体l1->setFont(QFont("楷体"));// 将文本框加入到父级,也就是 Widget 空窗口中l1->setParent(this);
}

6.2 QFont

QFont 专门用来设置字体

常用方法:

  • setBold(true); 是否加粗

  • setFamily("楷体"); 设置字形

  • setItalic(true); 设置倾斜

  • setPointSize(20); 设置字体大小

  • setWeight(QFont::Black); 设置加粗

#include <QFont>// 参数1: 显示文本
// 参数2: 当前窗口对象,将创建好的 QLabel 直接挂载到当前窗口中
QLabel *l2 = new QLabel("QFont字体测试", this);// 设置字体
QFont font;
font.setBold(true);
font.setFamily("楷体");
font.setItalic(true);
font.setPointSize(20);
font.setWeight(QFont::Black);
// 设置 l 应用字体
l2->setFont(font);

6.3 QPushButton

方式一:

#include <QPushButton>QPushButton *btn1 = new QPushButton;
btn1->setText("按钮1");
btn1->resize(80, 30);
btn1->move(50, 0);
btn1->setParent(this);

方式二:

// 参数1: 按钮中的文本
// 参数2: 父组件设置
QPushButton *btn2 = new QPushButton("按钮2", this);
btn2->move(200, 0);
btn2->setFont(QFont("楷体"));

6.4 QLineEdit

#include <QLineEdit>// 单行文本框
QLineEdit *txt = new QLineEdit;
txt->resize(100, 40);
txt->setText("请输入内容");
txt->resize(100, 30);
txt->move(200, 30);
txt->setParent(this);

6.5 登录界面

// 窗口设置
this->setWindowTitle("游戏登录");
this->setFixedSize(500, 300);// 请登录标题
QLabel *loginLabel = new QLabel("请登录", this);
loginLabel->setFont(QFont("黑体", 30, QFont::Black));
loginLabel->resize(150, 50);
loginLabel->move(177, 20);// 提供给账号和密码标签使用
QFont f("黑体", 14);// 账号设置
QLabel *accountLabel = new QLabel("账号:", this);
accountLabel->move(85, 98);
accountLabel->setFont(f);QLineEdit *accoutEdit = new QLineEdit(this);
accoutEdit->move(140, 95);
accoutEdit->resize(250, 40);
accoutEdit->setPlaceholderText("账号名/手机号/邮箱");// 密码设置
QLabel *pwdLabel = new QLabel("密码:", this);
pwdLabel->move(85, 160);
pwdLabel->setFont(f);QLineEdit *pwdEdit = new QLineEdit(this);
pwdEdit->move(140, 155);
pwdEdit->resize(250, 40);
pwdEdit->setPlaceholderText("密码");
// setEchoMode 用来设置QLineEdit 中的文本状态
// QLineEdit::Normal: 正常状态,明文显示
// QLineEdit::Password: 密码状态, 密文显示
// QLineEdit::PasswordEchoOnEdit: 输入时明文,失焦时密文
pwdEdit->setEchoMode(QLineEdit::Password);// 切换按钮
QPushButton *chgBtn = new QPushButton("明文", this);
chgBtn->resize(60, 40);
chgBtn->move(330, 155);// 重置和登录按钮
QPushButton *resetBtn = new QPushButton("重置", this);
QPushButton *loginBtn = new QPushButton("登录", this);
resetBtn->resize(80, 40);
loginBtn->resize(80, 40);
resetBtn->move(135, 220);
loginBtn->move(285, 220);

setEchoMode : 设置输出模式

  • QLineEdit::Password: 密码形式(密文输出)

  • QLineEdit::PasswordEchoOnEdit : 输入时明文,失焦后变为密文

7. 信号和槽

7.1 概述

  • 信号 和 槽 用于两个对象之间的通信,是 Qt 特有的消息传输机制。

  • 作用: 对一个部件进行操作时,另一个部件可以进行响应。

  • 信号函数 和 槽函数 通常位于某个类中

    • 信号函数用 signals 关键字修饰,

    • 槽函数用 public slots、protected slots 、private slots 修饰

    • signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字,专门用来指明信号函数和槽函数

  • connect 用于链接 信号 和 槽,使其产生需要的效果

// 参数1: 发送信号的部件
// 参数2: 发送的信号类型 (函数地址)
// 参数3: 处理信号的部件
// 参数4: 处理信号的方法 (函数地址)
connect(参数1, 参数2, 参数3, 参数4);// 参数1: 一个按钮对象 QPushButton
// 参数2: 发出点击信号
// 参数3: 窗口对象 QWidget
// 参数4: 执行的关闭函数
connect(myBtn, &QPushButton::clicked, this, &QWidget::close);

当 myBtn 按钮,发出一个点击信号时,当前的窗口对象 QWidget 就会关闭

7.2 快速上手

  • QPushButton 的信号:QPushButton 没有信号,但是 QPushButton 继承于 QAbstractButton, QAbstractButton 提供了若干信号

    • clicked() : 点击信号

    • pressed() : 按钮被按下的信号

    • released() : 按钮释放的信号

QWidget 的槽 (内置槽函数,功能固定)

示例:

  1. 点击最小化按钮时,将窗口隐藏到任务栏

核心: 按钮发送信号, 窗口响应信号并进行处理

  1. 点击最大化按钮时,将窗口最大化显示

  2. 点击关闭按钮时,关闭窗口

  3. 点击恢复按钮,窗口大小恢复到初始状态

// 最小化功能
QPushButton *minBtn = new QPushButton("最小化", this);
minBtn->move(10, 0);
// 参数1: 最小化按钮
// 参数2: 点击信号
// 参数3: 当前窗口对象
// 参数4: 内置的最小化槽函数
connect(minBtn, &QPushButton::clicked, this, &QWidget::showMinimized);// 最大化功能
QPushButton *maxBtn = new QPushButton("最大化", this);
maxBtn->move(100, 0);
// &QPushButton::pressed 按下信号,按下即触发
connect(maxBtn, &QPushButton::pressed, this, &QWidget::showMaximized);// 恢复功能
QPushButton *resetBtn = new QPushButton("恢复", this);
resetBtn->move(200, 0);
connect(resetBtn, &QPushButton::clicked, this, &QWidget::showNormal);// 关闭窗口
QPushButton *closeBtn = new QPushButton("关闭", this);
closeBtn->move(300, 0);
connect(closeBtn, &QPushButton::pressed, this, &QWidget::close);

7.3 槽函数设置

槽函数设置在 public/protected/private slots 或者 public 中

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();//在public/private/protected slots 节点现爱可以设置自定义槽函数
public:void response();
};#endif // WIDGET_H//.c#include "widget.h"#include <QPushButton>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent)
{//自定义槽函数QPushButton *btn1 = new QPushButton("click",this);btn1->move(20,60);connect(btn1,&QPushButton::clicked,this,&Widget::response);
}void Widget::response()
{qDebug() << "大头娃娃真难打....";}

7.4 Lambda 槽函数

// 参数3: lambda格式的处理信号的方法
connect(参数1, 参数2, lambda函数);使用lambda 表达式/QPushButton *btn2 = new QPushButton("lambda",this);btn2->move(120,60);//使用lambda表达式可以省略参数3//当信号发送时,就会自动执行lambda函数connect(btn2,&QPushButton::released,[](){qDebug() <<"黄风岭,八百里,全是大耗子...";});

7.5 登录完善

目标:

  • 点击重置按钮时,将表单内容重置为初始内容

  • 当用户输入 admin 和 123123 时,提示 "登录成功"; 反之,提示 "用户名或者密码错"

  • 点击 明文/密文 按钮时,密码框中的内容在明文和密文之间切换

1)点击重置按钮时,将表单内容重置为初始内容

connect(resetBtn, &QPushButton::clicked, [=](){accoutTxt->setText("请输入账号");pwdTxt->setText("请输入密码");
});

2)当用户输入 admin 和 123123 时,提示 "登录成功"; 反之,提示 "用户名或者密码错"

实现思路:

  • 点击登录按钮时获取账号框的内容 和 密码框的内容

  • 判断 账号框的内容 是否等于 admin 并且 密码框的内容是否等于 123213。

  • 相等 提示登录成功

  • 不等 提示账号或者密码错

//1.链接登录按钮的信号和槽connect(q1,&QPushButton::clicked,[=](){//2. 获取登录内容QString e = l1->text() ;QString e1 = l2->text();qDebug()<< e << e1;if(l1->text()=="admin"&&l2->text()=="123456"){qDebug() << "登录成功";}else {qDebug() <<"登录失败";}});

 3)点击修改按钮时,密码框中的内容在明文和密文之间切换

实现思路:

  • 头文件中设置 flag 标志, 为 true 时代表此时为密文, 为 false 时代表此时为明文

  • 给 明文 \ 密文 按钮添加点击信号

  • 信号处理函数( Lambda 表达式)中判断 flag 的值

    • 如果为 true,则将 按钮文字改为 密文, 密码框显示明文,flag 改为 false

    • 如果为 false,则将 按钮文字改为 明文, 密码框显示密文,flag 改为 true

connect(chgBtn, &QPushButton::clicked, [=](){flag = !flag;if (flag == true){pwdLine->setEchoMode(QLineEdit::Password);chgBtn->setText("明文");}else{pwdLine->setEchoMode(QLineEdit::Normal);chgBtn->setText("密文");}});

 完整代码:

#include "mywidget.h"#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QDebug>MyWidget::MyWidget(QWidget *parent): QWidget(parent)
{/4.lianxi//初始化窗口this->setWindowTitle("游戏登录");this->setFixedSize(500,300);QLabel *l = new QLabel;l->setParent(this);l->setText("请登录");l->move(200,50);QLabel *l1 = new QLabel;l1->setParent(this);l1->setText("账号:");l1->move(100,100);l1->setFont(QFont("楷体",15,QFont::Black));QLabel *l2 = new QLabel;l2->setParent(this);l2->setText("密码:");l2->move(100,150);l2->setFont(QFont("楷体",15,QFont::Black));l->setFont(QFont("楷体",20,QFont::Black));l->setAlignment(Qt::AlignHCenter);QLineEdit *e = new QLineEdit("账号名/手机号/邮箱",this);e->setPlaceholderText("账号/手机号/邮箱");QLineEdit *e1 = new QLineEdit("密码",this);e1->setPlaceholderText("密码");e1->setEchoMode(QLineEdit::Password);e->move(180,100);e1->move(180,150);e->resize(200,30);e1->resize(150,30);QPushButton *q = new QPushButton("重置",this);QPushButton *q1 = new QPushButton("登录",this);QPushButton *q2 = new QPushButton("明文",this);q->move(130,200);q->resize(50,30);q1->move(320,200);q1->resize(50,30);q2->move(329,150);q2->resize(50,30);//任务一:点击“重置”按钮,清空用户表单种填写的内容//任务二:点击“登录”按钮,得到用户填写的账号和密码验证//   如果账号为admin,密码为123456时,在控制台输出“登录成功”,反之,输出“账号或者密码错误”//任务三:点击“明文”按钮式,密码框的内容变为明文,按钮文字变为“密文”;//     再次点击时,密码框变为密文,按钮变为“明文”//1. 链接重置按钮的信号和槽connect(q,&QPushButton::clicked,[e,e1](){//2. 清空账号文本框的内容 和 密码框的内容e->setText("");e1->clear();});//1.链接登录按钮的信号和槽connect(q1,&QPushButton::clicked,[=](){//2. 获取登录内容QString e = l1->text() ;QString e1 = l2->text();qDebug()<< e << e1;if(l1->text()=="admin"&&l2->text()=="123456"){qDebug() << "登录成功";}else {qDebug() <<"登录失败";}});//两个状态:// 密码框是密文,按钮提示明文// 密码是明文 , 按钮提示密文//qDebug()<< e1->echoMode() << l2->text();connect(q2,&QPushButton::clicked,[=](){if(q2->text()=="明文"){e1->setEchoMode(QLineEdit::Normal);q2->setText("密文");}else{e1->setEchoMode(QLineEdit::Password);q2->setText("明文");}});}

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

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

相关文章

新建flask项目,配置入口文件,启动项目

pycharm新建flask项目时&#xff0c;会提供一个创建flask项目的导向&#xff0c;自动设置虚拟环境&#xff0c;并且安装flask及其依赖而vscode新建flask项目时&#xff0c;需要手动设置虚拟环境并安装flask&#xff0c;需要在终端使用pip install flask命令来安装flask及其依赖…

代码随想录 | Day25 | 二叉树:从中序与后序遍历构造二叉树最大二叉树

代码随想录 | Day25 | 二叉树&#xff1a;从中序与后序遍历构造二叉树&&最大二叉树 主要学习内容&#xff1a; 用中序和后序来构建二叉树 106.从中序与后序遍历构造二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 解法思路&a…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下玩转iSulad容器技术

828华为云征文&#xff5c;华为云Flexus云服务器X实例部署Xnote笔记应用 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、iSulad介绍2.1 iSulad简介2.2 iSulad特点 三、本次实践介绍3.1 本次实践…

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…

HTML5实现唐朝服饰网站模板源码

文章目录 1.设计来源1.1 网站首页-界面效果1.2 唐装演变-界面效果1.3 唐装配色-界面效果1.4 唐装花纹-界面效果1.5 唐装文化-界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcL…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

场景介绍 如今衣食住行娱乐影音应用占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的应用来说&#xff0c;总需要用户点开应用体验较繁琐。针对此种场景&#xff0c;HarmonyOS提供了Form Kit&#xff08;卡片开发服…

如何将泰语入门提高到精通呢?

要精通泰语&#xff0c;需要从基础的字母和发音开始学习&#xff0c;并通过积累词汇、频繁练习口语、沉浸在语言环境中来不断提高。参加在线课程或找专业教师进行系统性学习也很有帮助。此外&#xff0c;利用各种教材和在线资源&#xff0c;以及保持持续和一致的学习态度&#…

Spring Boot 学习之路 -- 处理 HTTP 请求

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码框架基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精…

电脑上数据丢了怎么找回来 Win系统误删文件如何恢复

无论是在工作中&#xff0c;还是生活中&#xff0c;电脑都是不可缺少的重要工具&#xff0c;尤其是在工作中&#xff0c;电脑不仅可以高效的完成工作&#xff0c;还可以存储工作中的重要资料。不过在使用电脑的时候&#xff0c;也会遇到数据丢失的情况。针对这一问题&#xff0…

Spring Boot 学习之路 -- 基础认知

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码框架基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精…

2024最新gewechat开发微信机器人教程说明

简介&#xff1a;本文将指导你如何搭建一个微信机器人&#xff0c;通过接入gewe框架实现智能回复与聊天功能。我们将从基础设置开始&#xff0c;逐步讲解如何配置机器人&#xff0c;并通过实例展示其实际应用。 随着人工智能技术的不断发展&#xff0c;智能机器人已经成为我们…

Hadoop 常用生态组件

Hadoop核心组件 安装 Hadoop 时&#xff0c;通常会自动包含以下几个关键核心组件&#xff0c;特别是如果使用了完整的 Hadoop 发行版&#xff08;如 Apache Hadoop、Cloudera 或 Hortonworks 等&#xff09;。这些组件构成了 Hadoop 的核心&#xff1a; 1. HDFS&#xff08;H…

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

高密度EEG人脑成像:技术与应用

摘要 EEG是一种非侵入性的人脑神经活动测量技术。随着数字技术的进步&#xff0c;EEG分析已从定性分析幅值和频率调制发展到全面分析记录信号的复杂时空特征。EEG能够在亚秒级的时间范围内测量神经过程&#xff0c;但其空间分辨率较低&#xff0c;这使得难以准确可靠地定位EEG…

批量发送邮件:性能优化与错误处理深度解析

目录 一、批量发送邮件的基础概述 1.1 批量发送邮件的定义 1.2 邮件发送流程 二、性能优化策略 2.1 发送速率控制 2.2 队列管理 2.3 动态IP池管理 2.4 智能调度 三、错误处理机制 3.1 暂时性发送错误处理 3.2 永久性发送错误处理 3.3 邮件反馈收集与分析 四、案例…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…

18923 二叉树的直径

### 思路 1. **构建二叉树**&#xff1a; - 使用输入数据构建二叉树。 - 使用一个数组或哈希表来存储每个节点的子节点。 2. **计算直径**&#xff1a; - 使用深度优先搜索&#xff08;DFS&#xff09;计算每个节点的深度。 - 计算每个节点的左子树和右子树的深度…

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

机器学习笔记(一)初识机器学习

1.定义 机器学习是一门多学科交叉专业&#xff0c;涵盖概率论知识&#xff0c;统计学知识&#xff0c;近似理论知识和复杂算法知识&#xff0c;使用计算机作为工具并致力于真实实时的模拟人类学习方式&#xff0c;并将现有内容进行知识结构划分来有效提高学习效率。 机器学习有…

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …