当前位置: 首页 > news >正文

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录

前言

一、UDP网络编程

1.Qt项目文件

2.UDP类

QUdpSocket

QNetworkDatagram

3.UDP回显服务器案例

细节

服务器设计

客户端设计

二、TCP网络编程

1.TCP类

QTcpServer

QTcpSocket

2.TCP回显服务器案例

细节

服务器设计

客户端设计

三、HTTP客户端

1.HTTP客户端类 

QNetworkAccessManager

QNetworkRequest

QNetworkReply

2.HTTP客户端案例


前言

        我们之前学习的系统相关的内容,在不同的系统下的理论和实现可能都不太一样,但是对于计算机网络模块来说,因为网络提供了不同主机之间的信息通信,那么如何想让两个主机进行通信,那么他们的通信模块,也就是计算机模块的实现也就必须是一样的才可以。所以说计算机网络模块的实现对于不同的系统也是一样的,最主要的区别就是在于语言层面上,对于网络编程的系统接口的封装。对于C++标准库中,一直是没有提供网络编程相关的API库。

        在整个网络协议栈来看,网络编程就是我们对于用户层的一种编写,但是我们想要传输数据的时候需要传输层协议的支持,但是传输层协议有两个,所以我们在应用层也需要采用一些接口去指定传输层协议。

一、UDP网络编程

1.Qt项目文件

        .pro文件是 Qt 项目文件。它是一个文本文件,包含了项目的各种信息和配置,用于指导qmake如何构建 Qt 项目。所以在Qt中进行网络编程之前,需要在项目当中的.pro文件中添加network模块来引入网络编程模块。在我们之前使用的所有控件都是包含在QtCore模块当中的,只不过默认生成.pro文件的时候就已经添加了。而且Qt来提供了很多其他的模块。

        Qt为什么要划分出这么多模块呢?因为Qt本身是一个非常大的框架,如果我们默认把所有Qt提高的功能模块全都一下引入项目当中,那么即使我们写一个简单的打印helloworld,那么生成的可执行程序也会 非常的大,可执行程序内部编译了许多用不到的内容。所以为了让生成的Qt项目更加的轻量化,那么就把不同的功能划分成了多个模块,我们需要使用的时候,就需要在.pro文件中引入包含了。

        而且为了让多模块的项目更加的轻量化,Qt也提高了模块的动态库和静态库的两种版本。 

2.UDP类

        Qt对于UDP的类有两个,一个是QUdpSocket表示udp通信套接字文件类,另一个是表示一个UDP数据报的类QNetworkDatagram类。

QUdpSocket
名称说明

bind(const QHostAddress&,  quint16)

绑定指定的端口号
receiveDatagram()返回一个UDP数据报对象
writeDatagram(const QNetworkDatagram&)发送一个UDP数据报
readyRead信号在收到数据并准备就绪后触发
  • 对于读取数据的操作,在C++语言层面的接口或者系统的底层原生接口默认都是阻塞方式的等待,当然也可以设置非阻塞,而Qt在处理读取数据操作的时候,并不是阻塞或者非阻塞等待的方式,而是采用信号槽机制,当有数据到来并就绪只会,就会发送readRead信号。
  • QHostAddress是一个用于表示IP地址的一个类,对于服务器来说设置为QHostAddress::Any即可,表示可以用于监听任何地址的连接,对于IPv4和IPv6都适用。
  • 对于bind函数可能会绑定失败,但是他会将失败的原因存放起来,可以通过errorString成员函数获取到失败信息。
QNetworkDatagram
名称说明
QNetworkDatagram(const QByteArray&, const HostAddress&, quint16)构造函数,通过QByteArray,目标ip和端口号构造一个UDP数据报
data()获取数据报内部持有的数据,返回一个QByteArray类型对象
senderAddress()获取数据报中包含的对端ip地址
senderPort()获取数据报中包含的对端端口号

3.UDP回显服务器案例

        只是一个使用网络接口的案例,因为一般来说服务器都不会带有图形化界面的。

细节
  • 在readyRead信号绑定槽函数和bind操作的顺序来说,要先绑定信号槽,后bind,因为一旦绑定ip和端口号之后,就可能会有通信数据到来了。那么在进行信号槽的绑定,就会来不及了,早到的数据就因为没有槽函数,所以不进行处理了。
  • 我们下面的服务器设计中带有了图形化界面,在配置文件.pro文件中也可以看到我们引入了gui模块,那么我们的云服务器默认是没有装配图形化界面的,所以是没有办法直接将我们下面写的服务器端代码放入到云服务器允许的。
  • 而对于我们现在写的Qt的udp客户端是可以直接连接linux服务器下的udp服务器的。所以说网络底层协议的实现都是一样的。udp都是一套逻辑。一般Qt都不会写服务器,大多数都是写客户端,然后用Qt客户端连接linux服务器。
服务器设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QString porcess(const QString& request);public slots:void processRequest();private:Ui::Widget *ui;//引入Udp成员QUdpSocket* socket;
};

widget.cpp文件 

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QNetworkDatagram>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建udp对象socket = new QUdpSocket(this);//设置窗口标题this->setWindowTitle("服务器");//连接信号槽connect(socket, &QUdpSocket::readyRead, this, &Widget::processRequest);//绑定端口号bool retbind = socket->bind(QHostAddress::Any, 8082);if(retbind == false){QMessageBox::critical(this, "服务器启动出错", socket->errorString());return;}}Widget::~Widget()
{delete ui;
}//但是我们这里是回显,所以没有什么处理过程
QString Widget::porcess(const QString &request)
{return request;
}void Widget::processRequest()
{//获取请求信息const QNetworkDatagram& udp_request =  socket->receiveDatagram();//转化为字符串类型QString data_request = udp_request.data();//处理请求const QString& data = porcess(data_request);//构建相应数据报QNetworkDatagram response(data.toUtf8(), udp_request.senderAddress(), udp_request.senderPort());//发送回客户端socket->writeDatagram(response);//把客户端发的信息显示到listWidget控件上QString log = "[" + udp_request.senderAddress().toString() + ":" + QString::number(udp_request.senderPort())+ "]" + "message:" + data_request;ui->listWidget->addItem(log);
}
客户端设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;//引入udp对象QUdpSocket* socket;
};

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QNetworkDatagram>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口名称this->setWindowTitle("客户端");//创建udp对象socket = new QUdpSocket(this);//连接信号槽connect(socket, &QUdpSocket::readyRead, this, [=](){//获取数据报const QNetworkDatagram udp_response = socket->receiveDatagram();//读取数据const QString& data = udp_response.data();//写入对话框中ui->listWidget->addItem("服务器:" + data);});
}Widget::~Widget()
{delete ui;
}
//发送按钮
void Widget::on_pushButton_clicked()
{//获取输入框的内容const QString& text = ui->lineEdit->text();//构建请求数据报const QString ip = "127.0.0.1";const quint16 port = 8082;QNetworkDatagram data_request(text.toUtf8(), QHostAddress(ip), port);//发送数据socket->writeDatagram(data_request);//更新对话框中的内容ui->listWidget->addItem("客户端:" + text);//情况输入框ui->lineEdit->clear();
}

二、TCP网络编程

1.TCP类

        Qt对于TCP的类提供两个,第一个是QTcpServer用于监听端口,实现获取客户端连接的操作,相当于是listensocket以及对于bind、listen以及accept接口函数的一个封装。第二个是用于客户端和服务器之间数据交互的类QTcpSocket类。

QTcpServer
名称说明
listen(const QHostAddress&, quint16 port)绑定ip和端口号,并开始监听,相当于bind和listen的结合
nextPendingConnection()从系统当中获取到一个已经建立好的tcp连接,返回一个QTcpSocket对象,通过这个对象是实现与客户端之间的通信
newConnection信号有新的客户端建立连接完毕之后触发的信号
QTcpSocket
名称说明
readAll()读取当前接收缓冲区中的所有数据,返回QByteArray对象
write(const QByteArray&)把输入写入到socket的发送缓冲区中
deleteLater()暂时把socket对象标记为无效,Qt会在下个事件循环中析构释放该对象、
peerAddress()获取对端ip地址
peerPort()获取对端端口号

connectToHost( const QString &hostName, quint16 port)

向服务器发起连接
readyRead信号有数据到来并准备就绪触发
disconnected信号连接断开的时候触发

2.TCP回显服务器案例

细节
  • 对于客户端向服务器发起连接的connectToHost函数返回值为void类型,但是我们还是要判断是否连接成功了,所以QTcpSocket类中提供了waitForConnected函数,该函数的作用是让当前线程处理等待状态,直到连接成功,或者连接反馈错误为止,又或者说超时。
服务器设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void processConnection();private:Ui::Widget *ui;//引入Tcp对象QTcpServer* socket;
};

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口标题this->setWindowTitle("服务器");//tcp对象实例化socket = new QTcpServer(this);//绑定newConnection的信号槽函数connect(socket, &QTcpServer::newConnection, this, &Widget::processConnection);//进行bind和listen操作bool retlisten = socket->listen(QHostAddress::Any, 8082);if(retlisten == false){QMessageBox::critical(this, "服务器启动失败", socket->errorString());return;}
}Widget::~Widget()
{delete ui;
}//获取新连接的信号处理函数
void Widget::processConnection()
{//获取新连接QTcpSocket* client = socket->nextPendingConnection();//构建日志QString log = "[" + client->peerAddress().toString() + ":" + QString::number(client->peerPort()) + "] 新客户端上线";ui->listWidget->addItem(log);//通过信号槽触发接收消息connect(client, &QTcpSocket::readyRead, this, [=](){//读取消息QString message = client->readAll();//处理消息--此处没有处理,只是回显//写回到客户端client->write(message.toUtf8());//构建日志QString log = "[" + client->peerAddress().toString() + ":" + QString::number(client->peerPort()) + "] say: " + message;//写到界面ui->listWidget->addItem(log);});//处理断开连接的信号槽函数connect(client, &QTcpSocket::disconnected, this, [=](){//构建日志QString log = "[" + client->peerAddress().toString() + ":" + QString::number(client->peerPort()) + "] 客户端下线";//释放对象client->deleteLater();});
}
客户端设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;//构建tcp对象QTcpSocket* socket;
};

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口标题this->setWindowTitle("客户端 ");//实例化tcp对象socket = new QTcpSocket(this);//向服务器发起连接socket->connectToHost("127.0.0.1", 8082);//确认是否连接成功if(!socket->waitForConnected()){QMessageBox::critical(this, "连接服务器出错", socket->errorString());return;}//绑定接收到消息的信号槽函数connect(socket, &QTcpSocket::readyRead, this, [=](){//获取接收到的内容QString message = socket->readAll();//将内容打印到对话框中QString log = "服务器: " + message;ui->listWidget->addItem(log);});
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取输入框的内容QString message = ui->lineEdit->text();//将内容发送给服务器socket->write(message.toUtf8());//将内容打印到对话框中ui->listWidget->addItem("客户端: " + message);//情况输入框ui->lineEdit->clear();
}

三、HTTP客户端

1.HTTP客户端类 

        Qt中为HTTP协议的客户端主要提供了三个类,一个是QNetworkAccessManager类,该类提供了HTTP有关的核心操作。第二个类是QNetworkRequest类表示一个不含body的HTTP请求。第三个类就是QNetworkReply类,表示一个HTTP的响应。

        上述也说了真正的服务器一定也不会使用Qt就实现,所以Qt就没有提供服务端相关的HTTP类。

QNetworkAccessManager
方法说明
get(const QNetworkRequest&)发起一个HTTP GET请求,返回一个QNetworkReply对象
post(const QNetworkRequest&, const QByteArray&)发起一个HTTP POST请求,也返回一个QNetworkReply对象
QNetworkRequest

        一个HTTP协议的完整报文应该是包括报头和有效载荷的,而这个类只是实现了一个报头,对于有效载荷该类不进行实现,而且对于请求报文来说一般都不会带有一些实质性的内容,只会传递一些kv形式的参数内容,通过post方法来传递,所以post方法也为我们提供了传递kv的参数。

方法说明
QNetworkRequest(const QUrl&)通过Url构造一个HTTP请求
setHeader(QNetworkRequest::knownHeaders header, const QVariant& value)设置请求头部字段

        对于报头的请求行字段,Qt也进行了一定的封装,方便我们去设置请求行,Qt中采用的是枚举类型将常用的请求行字段进行一一列举出来,QNetworkRequest::knownHeaders就是该枚举对象。 

        对于QVariant类对象表示一个类型可变的值。

QNetworkReply
方法说明
error()获取出错状态
errorString()获取出错原因的字符串描述
readAll()获取响应的body字段
header(QNetworkRequest::knownHeaders header)获取响应头部字段
finished信号当客户端收到一个完整的响应报文只会触发

2.HTTP客户端案例

细节

  • 如何想要显示出来元素的HTML报文,那么就不可以使用QTextEdit控件,因为他会对HTML代码进行渲染,显示出来的就不是原始的HTML报文了,所以需要使用QPlainTextEidt控件。
  • 对于get、post等系列函数只是负责发送请求,不负责请求的等待,所以说他返回的响应对象是一个没有实际内容的对象,那什么时候才收到响应呢?依靠的是finished信号,通过信号槽机制去处理finished信号,也就相当于处理响应了。
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkReply>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化manager = new QNetworkAccessManager(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取到输入框中的url,并构建一个url对象QUrl url(ui->lineEdit->text());//构造一个http请求对象QNetworkRequest request(url);//发送get请求,返回一个响应QNetworkReply* response = manager->get(request);//信号槽connect(response, &QNetworkReply::finished, this, [=](){//正确响应了if(response->error() == QNetworkReply::NoError){QString html_data = response->readAll();ui->plainTextEdit->setPlainText(html_data);}else{ui->plainTextEdit->setPlainText(response->errorString());}//释放response对象response->deleteLater();});
}

相关文章:

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录 前言 一、UDP网络编程 1.Qt项目文件 2.UDP类 QUdpSocket QNetworkDatagram 3.UDP回显服务器案例 细节 服务器设计 客户端设计 二、TCP网络编程 1.TCP类 QTcpServer QTcpSocket 2.TCP回显服务器案例 细节 服务器设计 客户端设计 三、HTTP客户端 1.HTTP…...

两台局域网电脑通过飞秋传输大文件失败的解决方案

问题描述&#xff1a; 局域网两台电脑之间传输大文件&#xff08;超过20G&#xff09;&#xff0c;不想太复杂&#xff0c;就各装个飞秋。但是通过直接发送文件发现总是失败&#xff0c;一会就中断了。 解决方法&#xff1a; 主界面上有一个文件共享的按钮&#xff0c;通过文…...

安卓程序作为web服务端的技术实现(二):Room 实现数据存储

已经实现web服务器安卓程序作为web服务端的技术实现&#xff1a;AndServer 实现登录权限拦截-CSDN博客 现在需要和正常web项目类似&#xff0c;那么就需要操作数据库 一般web项目都是选择较为重型的数据库如MySQL&#xff0c;SQL server等 这里是安卓项目&#xff0c;我目前…...

代码工艺:实践 Spring Boot TDD 测试驱动开发

TDD 的核心理念是 “先写测试&#xff0c;再写功能”&#xff0c;其过程遵循一个严格的循环&#xff0c;即 Red-Green-Refactor&#xff1a; TDD 的流程 1. Red&#xff08;编写失败的测试&#xff09; 根据需求&#xff0c;先编写一个测试用例&#xff0c;描述期望的行为。…...

MySQL命令及用法(精华版)

目录 DDL&#xff08;数据定义语言&#xff09; 数据库操作 表操作 DML&#xff08;数据操作语言&#xff09; DQL&#xff08;数据查询语言&#xff09; 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 DCL&#xff08;数据控制语言&#xff09; 用户…...

73,【5】BUUCTF WEB [网鼎杯 2020 玄武组]SSRFMe(未解出)

进入靶场 又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码 <?php // 检查 URL 是否为内部 IP 地址 function check_inner_ip($url) {// 使用正则表达式检查 URL 格式是否以 http、https、gopher 或 d…...

修改word的作者 最后一次保存者 总编辑时间 创建时间 最后一次保存的日期

作者&#xff1a; 1.打开word文件 2.点击左上角的文件 3.选项 4.用户信息 5.将用户信息中的 姓名改为你需要的名字 最后一次保存者 1.word重命名为.zip文件 2.docProps中有个core.xml 3.用记事本打开有个lastModifiedBy标签&#xff0c;将里面内容改为你需要的名字 总编辑时…...

深入MapReduce——引入

引入 前面我们已经深入了HDFS的设计与实现&#xff0c;对于分布式系统也有了不错的理解。 但HDFS仅仅解决了海量数据存储和读写的问题。要想让数据产生价值&#xff0c;一定是需要从数据中挖掘出价值才行&#xff0c;这就需要我们拥有海量数据的计算处理能力。 下面我们还是…...

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念&#xff0c;本文就将对此…...

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

&#xff08;一&#xff09;问题描述 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…...

C++:将字符数组rkpryyrag,每个字母转换为其前面第13个字母后输出,如果超过a则从z再继续接着数。例如:b前面第1个字母是a。a前面第3个字母是x。

代码如下&#xff1a; #include <iostream> #include <string> using namespace std;int main(){string str "rkpryyrag";for (int i 0; i < str.length(); i){if (str[i] > a && str[i] < z){if (str[i] - a < 13){cout <<…...

特征选择(机器学习)

目录 1. 为什么需要特征选择2. 常见的特征选择方法2.1 过滤式&#xff08;Filter Methods&#xff09;小示例&#xff08;用 Python 伪代码表达&#xff09;&#xff1a; 2.2 包裹式&#xff08;Wrapper Methods&#xff09;小示例&#xff08;RFE 伪代码示例&#xff09;&…...

基于微信小程序的个人健康管理系统

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

Windows系统提示RunDLL PcaWallpaperAppDetect错误修复方法

最近&#xff0c;Win11 24H2预览版和Win10 LTSC 2025功能更新偶尔会触发RunDLL错误弹窗 具体表现为 //英文提示 Error in C:\WINDOWS\system32\PcaSvc.dll Missing entry: PcaWallpaperAppDetect//中文提示 C:\WINDOWS\system32\PcaSvc.dll出错 丢失条目:PcaWallpaperAppDe…...

文件上传漏洞详解

第一关&#xff08;JS绕过&#xff09; 1.1使用bp进行绕过 先将要上传的php文件的后缀改为png&#xff0c;然后在上传时抓包&#xff0c;将png后缀再改为php&#xff0c;发包&#xff0c;此时上传成功 1.2使用js进行绕过 打开浏览器的检查&#xff0c;将其中的checkFile函数…...

mysql的mvcc

快速搞懂mvcc 全称 multi-version concurrency control 多版本并发控制。自动开启事务undo log读视图(read_view)结果过滤mvcc只在读已提交和可重复读隔离级别下运作读已提交隔离级别下&#xff0c;可重复读隔离级别下&#xff0c;总的来说mvcc是为了提高数据库并发性能而设计的…...

漏洞情报:为什么、要什么和怎么做

漏洞一直是网络攻防的焦点所在&#xff0c;因为漏洞直接或间接影响安全性的核心方面——权限。攻击者挖掘和利用漏洞&#xff0c;获取非授权的权限&#xff1b;防御方定位和消除漏洞&#xff0c;监测和阻断漏洞的利用&#xff0c;使攻击者无法利用漏洞达到其目的。漏洞信息本质…...

kotlin的协程的基础概念

Kotlin的协程是一种用于简化异步编程的强大工具。 理解协程的基础概念可以帮助开发者有效地利用其能力。 以下是Kotlin协程的一些关键基础概念&#xff1a; 协程&#xff08;Coroutines&#xff09; &#xff1a; 协程是一种用于处理并发任务的编程模型&#xff0c;它可以在单…...

C语言教程——动态内存管理(2)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 我们之前学了动态内存管理分配函数&#xff0c;也是熟悉了动态内存分配函数&#xff0c;基于动态内存分配我把之前的通讯录做了修改&#xff0c;上传到了gitee上&#xff0c;这篇文章接着…...

LeetCode刷题 -- 45.跳跃游戏 II

题目 C代码 int jump(int* nums, int numsSize) {int i 0;int j 0;int last_i 0;int last_can 0;int max_i 0;int max_can 0;int min_jump 0;if (numsSize < 2) {//注意点1&#xff1a;数组小于两个的时候&#xff0c;只需要跳转0次&#xff1b;goto end;}// 注意点…...

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计

技术背景 我们在做RTMP|RTSP播放器的时候&#xff0c;有这样的技术诉求&#xff0c;有的摄像头出来的数据是有角度偏差的&#xff0c;比如“装倒了”&#xff0c;或者&#xff0c;图像存在上下或者左右反转&#xff0c;这时候&#xff0c;就需要播放器能做响应的处理&#xff…...

vulnhub靶场【kioptrix-1靶机】

前言 靶机&#xff1a;kioptrix-1&#xff0c;IP地址为192.168.1.104 攻击&#xff1a;kali&#xff0c;IP地址为192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 文章中涉及的靶机&#xff0c;来源于vulnhub官网&#xff0c;想要下载&#xff0c;可自行访问官网下载&…...

PyQt5之QCalendarWidget

十八、QCalendarWidget 1.描述 提供了一个基于每月日历控件&#xff0c;允许用户选择一个日期。 继承自QWidget 2.功能作用 (1) 构造函数 QCalendarWidget(parent: QWidget None)(2) 日期范围 setMinimumDate(QDate date) minimumDate() -> QDate setMaximumDate(QD…...

【Qt】窗口

窗口 菜单栏 QMenuBar给菜单设置快捷键添加子菜单添加分割线设置图标 工具栏 QToolBar状态栏 QStatusBar浮动窗口 QDockWidget对话框自定义对话框通过代码方式通过图形化方式 模态对话框 Qt 内置对话框消息对话框 QMessageBox颜色对话框 QColorDialog文件对话框 QFileDialog字体…...

初阶5 排序

本章重点 排序的概念常见排序的算法思想和实现排序算法的复杂度以及稳定性分析 1.排序的概念 排序: 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性: 假定在待排序的记录序列中&#xff0…...

备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…...

qml ColumnLayout详解

1、概述 ColumnLayout 是 QML 中用于在垂直方向上排列子元素的一种布局管理器。它继承自 Item 并提供了简单的布局机制&#xff0c;使得子元素能够按照从上到下的顺序自动排列。ColumnLayout 通常用于创建具有垂直层次结构的用户界面。 2、重要属性 layoutDirection 类型&…...

Qt 5.14.2 学习记录 —— 십팔 对话框

文章目录 1、Qt对话框2、自定义对话框1、代码方式2、图形化方式 3、模态对话框4、QMessageBox5、QColorDialog6、QFileDialog7、QFontDialog8、QInputDialog 1、Qt对话框 Qt的对话框用QDialog类来表示&#xff0c;可以自定义一些类来实现自定义对话框&#xff0c;但需要继承自…...

AI 编程工具—Cursor进阶使用 Rules for AI

AI 编程工具—Cursor进阶使用 Rules for AI 这里配置是给所有的会话和内嵌模式的,你可以理解为是一个全局的配置 下面的代码是之前Cursor 给我们生成的,下面我们开始配置Rules ,来让Cursor生成的代码更加符合我们的编程习惯 def quick_sort(arr):"""使用快…...

SpringBoot 实现动态管理定时任务 Job的动态操作(添加、修改、启停、执行、删除)以及界面展示和具体Job的创建与执行示例

SpringBoot 实现动态管理定时任务 Job的动态操作&#xff08;添加、修改、启停、执行、删除&#xff09;以及界面展示和具体Job的创建与执行示例 关键接口类&#xff1a; CronTaskRegistrar SchedulingRunnable . 添加定时任务注册类&#xff0c;用来增加、删除定时任务 impo…...

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…...

_CLASSDEF在C++中的用法详解及示例

_CLASSDEF在C++中的用法详解及示例 _CLASSDEF的定义与使用示例说明代码解析总结在C++编程中,宏(Macro)是一种预处理指令,它允许程序员在编译之前对代码进行文本替换。_CLASSDEF是一个自定义的宏,它提供了一种便捷的方式来定义类及其相关类型。本文将详细介绍_CLASSDEF在C+…...

缓存-Redis-数据结构-redis哪些数据结构是跳表实现的?

在 Redis 中&#xff0c;跳表&#xff08;Skip List&#xff09; 被用于实现 有序集合&#xff08;Sorted Set&#xff09; 数据结构。以下是对此实现的详细解释&#xff1a; Redis中的有序集合&#xff08;Sorted Set&#xff09; 有序集合&#xff08;Sorted Set&#xff0…...

K8S中Service详解(二)

Service类型 Service的资源清单文件&#xff1a; --- kind: Service # 资源类型 apiVersion: v1 # 资源版本 metadata: # 元数据name: service # 资源名称namespace: dev # 命名空间 spec: # 描述selector: # 标签选择器&#xff0c;用于确定当前service代理哪些podapp: ngin…...

鸿蒙模块概念和应用启动相关类(HAP、HAR、HSP、AbilityStage、UIAbility、WindowStage、window)

目录 鸿蒙模块概念 HAP entry feature har shared 使用场景 HAP、HAR、HSP介绍 HAP、HAR、HSP开发 应用的启动 AbilityStage UIAbility WindowStage Window 拉起应用到显示到前台流程 鸿蒙模块概念 HAP hap包是手机安装的最小单元&#xff0c;1个app包含一个或…...

【EXCEL_VBA_实战】多工作薄合并深入理解

工作背景&#xff1a;多个工作薄存在冲突的名称&#xff0c;需快速合并 困难点&#xff1a;工作表移动复制时&#xff0c;若有冲突的名称&#xff0c;会不断弹出对话框待人工确认 思路&#xff1a;利用代码确认弹出的对话框 关键代码&#xff1a;Application.DisplayAlerts …...

Maven的下载安装配置

maven的下载安装配置 maven是什么 Maven 是一个用于 Java 平台的 自动化构建工具&#xff0c;由 Apache 组织提供。它不仅可以用作包管理&#xff0c;还支持项目的开发、打包、测试及部署等一系列行为 Maven的核心功能 项目构建生命周期管理&#xff1a;Maven定义了项目构建…...

网络打印机的搜索与连接(一)

介绍 网络打印机就是可以通过网络连接上的打印机&#xff0c;这类打印机分2种&#xff1a;自身具有互联网接入功能可以分配IP的打印机我们称为网络打印机、另外一种就是被某台电脑连接上去后通过共享的方式共享到网络里面的我们称为共享打印机。现在还有一种可以通过互联网连接…...

高并发压力测试

高并发压力测试 CountDownLatch就是JUC包下的一个工具&#xff0c;整个工具最核心的功能就是计数器。 需要一个并发安全的计数器来操作。CountDownLatch就可以实现。 给CountDownLatch设置一个数值。 每个业务处理完毕之后&#xff0c;执行一次countDown方法&#xff0c;指…...

Python中采用.add_subplot绘制子图的方法简要举例介绍

Python中采用.add_subplot绘制子图的方法简要举例介绍 目录 Python中采用.add_subplot绘制子图的方法简要举例介绍一、Python中绘制子图的方法1.1 add_subplot函数1.2 基本语法&#xff08;1&#xff09;add_subplot的核心语法&#xff08;2&#xff09;add_subplot在中编程中的…...

ipad和macbook同步zotero文献附件失败的解决办法

背景&#xff1a;我所有的文献及其附件pdf都是在台式机&#xff08;windows系统&#xff09;&#xff0c;想要把这些文献同步到云上&#xff0c;然后再从云上同步到平板和其他笔记本电脑比如macbook。文献同步虽已成功&#xff0c;但文献附件都无法打开。 平板报错如下&#xf…...

循环队列(C语言)

从今天开始我会开启一个专栏leetcode每日一题&#xff0c;大家互相交流代码经验&#xff0c;也当作我每天练习的自我回顾。第一天的内容是leetcode622.设计循环队列。 一、题目详细 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#…...

Amazon Redshift实用命令语句

1. 数据库管理相关命令 创建数据库 CREATE DATABASE mydatabase;Amazon Redshift创建数据库命令除了基本形式外&#xff0c;还有以下几种带不同参数的形式&#xff1a; 带OWNER参数 可以指定数据库的所有者&#xff0c;通常是一个数据库用户或角色。 CREATE DATABASE myda…...

音频入门(二):音频数据增强

本文介绍了一些常见的音频数据增强方法&#xff0c;并给出了代码实现。 目录 一、简介 二、代码 1. 安装必要的库 2. 代码 3. 各函数的介绍 4. 使用方法 参考&#xff1a; 一、简介 音频数据增强是机器学习和深度学习领域中用于改善模型性能和泛化能力的技术。 使用数据…...

【Hadoop面试题2025】

文章目录 简单题故障及相应的处理方法中等难度高难度小文件小文件的产生小文件问题的影响小文件治理方案推荐方案 冷文件冷文件的产生冷文件问题的影响冷文件治理方案推荐方案 简单题 一、基础概念类 什么是Hadoop&#xff1f; 答案&#xff1a;Hadoop是一个开源的分布式计算框…...

Unity自学之旅03

Unity自学之旅03 Unity自学之旅03&#x1f4dd; 碰撞体 Collider 基础定义与作用常见类型OnCollisionEnter 事件碰撞触发器 &#x1f917; 总结归纳 Unity自学之旅03 &#x1f4dd; 碰撞体 Collider 基础 定义与作用 定义&#xff1a;碰撞体是游戏中用于检测物体之间碰撞的组…...

STranslate 中文绿色版即时翻译/ OCR 工具 v1.3.1.120

STranslate 是一款功能强大且用户友好的翻译工具&#xff0c;它支持多种语言的即时翻译&#xff0c;提供丰富的翻译功能和便捷的使用体验。STranslate 特别适合需要频繁进行多语言交流的个人用户、商务人士和翻译工作者。 软件功能 1. 即时翻译&#xff1a; 文本翻译&#xff…...

树的存储(c++)

树结构相对线性结构来说就⽐较复杂。存储时&#xff0c;既要保存值域&#xff0c;也要保存结点与结点之间的关系。实际中树有很多种存储⽅式&#xff1a;双亲表⽰法&#xff0c;孩⼦表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。现阶段&#xff0c;我们只⽤掌握孩⼦表⽰法&…...

JVM面试题解,垃圾回收之“对象存活判断”剖析

一、JVM怎么判断一个类/对象是不是垃圾&#xff1f; 先来说如何判断一个对象是不是垃圾 最常用的就是引用计数法和可达性分析 引用计数法 引用计数法为每个对象维护一个计数器来跟踪有多少个引用指向该对象。每当创建一个新的引用指向某个对象时&#xff0c;计数器加1&…...

【Elasticsearch】 Ingest Pipeline `processors`属性详解

在Elasticsearch中&#xff0c;Ingest Pipeline 的 processors 属性是一个数组&#xff0c;包含一个或多个处理器&#xff08;processors&#xff09;。每个处理器定义了一个数据处理步骤&#xff0c;可以在数据索引之前对数据进行预处理或富化。以下是对 processors 属性中常见…...