百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

18.1 PyQt5网络编程-QNetworkAccessManager

yund56 2025-03-11 16:33 4 浏览

1.QNetworkAccessManager简介

在 PyQt5 中的网络编程涉到 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply这几个类来处理网络请求和响应。

2.QNetworkAccessManager案例

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtCore import QUrl


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 设置主窗口
        self.setWindowTitle('PyQt5网络编程')
        self.resize(600, 400)

        # 创建中心小部件和布局
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)

        # 创建标签用于显示网络响应
        self.label = QLabel('网络请求结果:')
        self.label_1 = QLabel('等待网络返回...')
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.label_1)

        # 创建网络访问管理器
        self.network_manager = QNetworkAccessManager()
        self.network_manager.finished.connect(self.on_finished)

        # 发起网络请求
        url = QUrl('https://api.oick.cn/api/dutang')
        request = QNetworkRequest(url)
        self.reply = self.network_manager.get(request)

    def on_finished(self, reply):
        if reply.error() == QNetworkReply.NoError:
            response_data = reply.readAll().data().decode('utf-8')
            self.label_1.setText(response_data)
        else:
            self.label.setText('Error: {}'.format(reply.errorString()))
        reply.deleteLater()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

3.运行结果

4.QNetworkAccessManager常用方法和属性

方法和属性

描述

get(request: QNetworkRequest)

发起GET请求,参数为 QNetworkRequest 对象,返回一个QNetworkReply对象,代表服务器的响应结果

post(request: QNetworkRequest, data: Union[QByteArray, bytes, bytearray])

发起POST请求。参数:QNetworkRequest:请求对象;data:要发送的数据,可以是 QByteArraystrbytes

put(request: QNetworkRequest, data: Union[QByteArray, bytes, bytearray])

发起PUT请求。参数:QNetworkRequest:请求对象;data:要发送的数据,可以是 QByteArraystrbytes

deleteResource(request: QNetworkRequest)

发起DELETE请求

head(request: QNetworkRequest)

发起HEAD请求,类似于GET请求,但只获取响应的头部信息,不获取实际的内容

setProxy(proxy: QNetworkProxy)

设置代理,例如: QNetworkProxy(QNetworkProxy.HttpProxy, "proxy.example.com", 8080) QNetworkProxy代理类型: NoProxy:不使用代理 DefaultProxy:使用系统默认代理 HttpProxy:HTTP 代理 Socks5Proxy:Socks5 代理

proxy()

返回当前使用的代理

setCache(cache: Optional[QAbstractNetworkCache])

设置网络请求使用的缓存对象

cache()

返回当前使用的缓存对象

setNetworkAccessible(accessible: QNetworkAccessManager.NetworkAccessibility)

设置网络的可访问性,可以设置为
QNetworkAccessManager.Accessible

QNetworkAccessManager.NotAccessible

networkAccessible()

返回网络的可访问性,返回NetworkAccessibility

clearConnectionCache()

清除连接缓存,关闭所有已建立的网络连接

setConfiguration(config: QNetworkConfiguration)

设置网络的配置,如使用特定的网络接口

configuration()

获取当前的网络配置

setProxyFactory(factory: Optional[QNetworkProxyFactory])

设置代理工厂,参数QNetworkProxyFactory是一个抽象类,允许根据不同的请求设置不同的代理

proxyFactory()

获取当前代理工厂信息,返回QNetworkProxyFactory

5.QNetworkRequest常用方法和属性

方法和属性

描述

setUrl(url: QUrl)

设置请求的 URL

url()

获取请求的URL

setHeader(header: QNetworkRequest.KnownHeaders, value: Any)

设置请求头

header(header: QNetworkRequest.KnownHeaders)

获取指定的请求头信息,请求头详见下方KnownHeaders请求头枚举值

setRawHeader(headerName: Union[QByteArray, bytes, bytearray], value: Union[QByteArray, bytes, bytearray])

设置自定义的原始请求头部信息,例如:setRawHeader(headerName="User-Agent", value="MyApp/1.0")

rawHeader(headerName: Union[QByteArray, bytes, bytearray])

获取指定原始头部的值

rawHeaderList()

返回请求中所有原始头部名称的列表

setAttribute(code: QNetworkRequest.Attribute, value: Any)

设置请求的属性,属性可以包括缓存策略、HTTP 协议类型等,详见下方Attribute枚举值

attribute(code: QNetworkRequest.Attribute, defaultValue: Any = None)

获取请求属性的值,如果未设置则返回默认值

setPriority(priority: QNetworkRequest.Priority)

设置请求的优先级。优先级可以是
QNetworkRequest.HighPriority
, NormalPriority, 或 LowPriority

priority()

获取请求的优先级

setTransferTimeout(timeout: int)

设置请求的传输超时时间(毫秒)

transferTimeout()

获取传输超时时间

KnownHeaders请求头枚举值:

  1. QNetworkRequest.ContentTypeHeader: 设置请求的 Content-Type 头部,用于指明请求体的数据格式。
  2. QNetworkRequest.ContentLengthHeader: 设置请求的 Content-Length 头部,用于指明请求体的长度。
  3. QNetworkRequest.User: 用户定义的头部。
  4. QNetworkRequest.LastModifiedHeader: 设置请求的 Last-Modified 头部,用于指明资源最后一次修改的时间。
  5. QNetworkRequest.DateHeader: 设置请求的 Date 头部,用于指明请求的时间戳。
  6. QNetworkRequest.CacheControlHeader: 设置请求的 Cache-Control 头部,用于控制缓存行为。
  7. QNetworkRequest.ConnectionHeader: 设置请求的 Connection 头部,用于指明连接保持的方式。
  8. QNetworkRequest.KeepAliveHeader: 设置请求的 Keep-Alive 头部,用于维持连接。
  9. QNetworkRequest.AcceptHeader: 设置请求的 Accept 头部,用于指明客户端接受的内容类型。
  10. QNetworkRequest.AcceptCharsetHeader: 设置请求的 Accept-Charset 头部,用于指明客户端接受的字符集。
  11. QNetworkRequest.AcceptEncodingHeader: 设置请求的 Accept-Encoding 头部,用于指明客户端接受的内容编码。
  12. QNetworkRequest.AcceptLanguageHeader: 设置请求的 Accept-Language 头部,用于指明客户端接受的语言。
  13. QNetworkRequest.AuthorizationHeader: 设置请求的 Authorization 头部,用于提供认证信息。
  14. QNetworkRequest.CookieHeader: 设置请求的 Cookie 头部,用于发送客户端的 Cookie 信息。
  15. QNetworkRequest.ExpectHeader: 设置请求的 Expect 头部,用于指明客户端期望的响应行为。
  16. QNetworkRequest.IfMatchHeader: 设置请求的 If-Match 头部,用于条件请求。
  17. QNetworkRequest.IfModifiedSinceHeader: 设置请求的 If-Modified-Since 头部,用于条件请求。
  18. QNetworkRequest.IfNoneMatchHeader: 设置请求的 If-None-Match 头部,用于条件请求。
  19. QNetworkRequest.IfRangeHeader: 设置请求的 If-Range 头部,用于条件请求。
  20. QNetworkRequest.IfUnmodifiedSinceHeader: 设置请求的 If-Unmodified-Since 头部,用于条件请求。
  21. QNetworkRequest.MaxForwardsHeader: 设置请求的 Max-Forwards 头部,用于限制请求的转发次数。
  22. QNetworkRequest.ProxyAuthorizationHeader: 设置请求的 Proxy-Authorization 头部,用于提供代理认证信息。
  23. QNetworkRequest.TEHeader: 设置请求的 TE 头部,用于指明传输编码能力。
  24. QNetworkRequest.UpgradeHeader: 设置请求的 Upgrade 头部,用于指明协议升级请求。
  25. QNetworkRequest.ViaHeader: 设置请求的 Via 头部,用于指明中间节点。
  26. QNetworkRequest.WarningHeader: 设置请求的 Warning 头部,用于传递警告信息。
  27. QNetworkRequest.TransferEncodingHeader: 设置请求的 Transfer-Encoding 头部,用于指明传输编码方式。

Attribute枚举值

  1. HttpStatusCodeAttribute: HTTP 响应的状态码。
  2. RedirectionTargetAttribute: 重定向的目标 URL。
  3. ConnectionEncryptedAttribute: 表示连接是否加密(HTTPS)。
  4. CacheLoadControlAttribute: 控制缓存的加载策略。
  5. CacheSaveControlAttribute: 决定响应是否应该保存到缓存中。
  6. SourceIsFromCacheAttribute: 表示响应是否来自缓存。
  7. DoNotBufferUploadDataAttribute: 控制上传的数据是否应缓冲。

6.QNetworkReply常用方法和属性

方法和属性

描述

error()

获取请求的错误代码

errorString()

获取请求错误的详细描述

bytesAvailable()

返回可用的响应数据的字节数。用于读取尚未读取的数据量

hasRawHeader(headerName: Union[QByteArray, bytes, bytearray])

检查是否存在指定的原始头部

rawHeader(headerName: Union[QByteArray, bytes, bytearray])

获取指定原始头部的值

header(header: QNetworkRequest.KnownHeaders)

获取标准请求头的值

url()

获取请求的 URL

attribute(code: QNetworkRequest.Attribute)

获取请求属性的值

isFinished()

检查请求是否完成

isRunning()

检查请求是否正在运行

readAll()

读取所有响应数据。通常在处理完响应时调用

deleteLater()

将对象标记为待删除状态,当事件处理完成后会被自动删除。有助于防止内存泄漏。

7.QNetworkAccessManager常用信号

方法

描述

finished(QNetworkReply*)

当一个网络请求完成时(无论成功或失败),触发此信号。此信号携带一个 QNetworkReply 对象,该对象包含了请求的响应数据或错误信息

sslErrors(QNetworkReply*, const QList&)

当 HTTPS 请求过程中发生 SSL 错误时触发此信号,也可使用reply.ignoreSslErrors()方法来忽略错误。参数:QNetworkReply*: 产生 SSL 错误的网络请求的响应对象;QList: 发生的 SSL 错误列表

authenticationRequired(QNetworkReply, QAuthenticator)

当服务器需要身份验证时触发此信号。可以在此信号中设置 QAuthenticator 的用户名和密码来进行身份验证。例如:authenticator.setUser("username") authenticator.setPassword("password")

proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)

当代理服务器需要身份验证时触发此信号。可以在此信号中为代理设置认证信息。例如:authenticator.setUser("proxyuser") authenticator.setPassword("proxypassword")

networkAccessibleChanged(QNetworkAccessManager.NetworkAccessibility)

当网络的可访问性发生变化时触发此信号。返回新的网络可访问状态。可能是一下之一:Accessible: 网络可访问;NotAccessible: 网络不可访问;UnknownAccessibility: 网络可访问性未知

encrypted(QNetworkReply*)

当使用 SSL/TLS 加密的请求已经成功建立安全连接时触发此信号

8.QNetworkReply常用信号

方法

描述

downloadProgress(qint64 bytesReceived, qint64 bytesTotal)

下载进度更新时发射的信号,bytesReceived:已经接收到的字节数;bytesTotal:总共需要接收的字节数

uploadProgress(qint64 bytesSent, qint64 bytesTotal)

上传进度更新时发射的信号,bytesSent:已经发送的字节数;bytesTotal:总共需要发送的字节数



相关推荐

一对多查询,Vlookup公式组合Countifs,详细解读!

我们模拟工作中的使用场景,只保留了关键的两列数据需要根据部门条件,把所有的员工信息给匹配出来首先,当存在多个结果值时,我们去查找的时候,只会返回第一个出现的值:=VLOOKUP(D2,A:B,2,0)...

自动获取vlookup函数的第三参数,再也不用一列一列的数了

对于vlookup函数,很多人都有会这样的想法:vlookup函数的第三参数为什么就不能自动的获取到呢,还需要一个一个的数太烦人了。有没有什么方法能自动的获取vlookup函数的第三参数呢?当然有了,...

VLOOKUP函数比对一般用法

格式"=VLOOKUP(要查谁,在哪查,返还值为查询范围的第几列,精确还是近似)"。中间用逗号隔开。如:A列为全部人员姓名,B列为对应全部身份证号码,C列为部分人员姓名(有在A列里的,...

VLOOKUP的这些坑,你都知道吗?

VLOOKUP的这些坑,你都知道吗?VLOOKUP是大家常用的查找引用函数,很多人正式学习Excel都是从这个函数开始的,但有的时候VLOOKUP却不太听话,公式返回错误结果,让人苦不堪言。有时明明数...

重塑Excel体验:VLOOKUP与公式联动,轻松实现多列信息一键匹配!

真心羡慕啊!每次我都要慢悠悠地一个个用VLOOKUP去找数据,跟蜗牛爬似的慢,还容易出错,可你看看人家同事,手一挥,几十秒就搞定了,那叫一个利索!步骤一:输入VLOOKUP函数并设置查找值在需要输入公...

巧用Vlookup函数揪出“第三者”

在一张Excel表格的重复记录中,让你快速列出每种不同物品第2次或第n次出现的记录,你会怎么做?Vlookup函数就有这个本事。举例来说,产品或者物流表格中往往会记录有同一货物的多笔数据(如下图的今日...

一次匹配多个值,Vlookup、Xlookup、Filter公式,你用哪个

举个工作实例,左边是员工信息表数据需要根据编号,把后面所有的信息一次性的匹配出来工作中,经常遇到这种问题,有3个公式,可以快速的解决,分别是VLOOKUP公式,XLOOKUP公式,Filter公式1、...

Excel实例:VLOOKUP与XLOOKUP双条件精确查找、模糊查找

咱们今天通过实例聊聊VLOOKUP和XLOOKUP,看看它们在精确和模糊查找上有什么不同。我们假设有一个数据表,这个表里有地区、品类以及对应的金额。根据大区和品类这两个条件,来查找并匹配出相应的金额数...

带超链接的Vlookup公式查找匹配,你会么

举个例子,左边有源数据,现在我们需要根据部分员工数据,查找匹配工资,并且带一个超链接,当我们点击工资数据时,自动跳转到原数据位置1、查找结果正常我们想查找匹配出结果,用vlookup公式,或xlook...

Vlookup公式查找出错,原表明明有数据

Vlookup公式天天用,但是经常出错,还找不出原因,今天分享3步检查曲,举个工作中的例子:左边是工资表,需要查找匹配部分员工的工资数据1、公式引用出错我们使用VLOOKUP公式,查找匹配,输入的公式...

不用嵌套其它函数,VlOOKUP实现一对多查找

在处理日常工作时,我们常会遇到一份详细的花名册,其中记录了众多人员的多项信息。然而,当需要从这份名单中快速提取特定人员的相关资料时,一个常见的问题是:目标信息与花名册中的列顺序并不一致。如图所示:面对...

VLOOKUP函数开挂用法:多表多文件多区域查找大揭秘

在日常办公中,Excel堪称我们的得力助手,而VLOOKUP函数更是其中的明星,被大家广泛运用,堪称“数据查找神器”。说起VLOOKUP函数,相信大家都不陌生。最常见的用法,就是在一个表...

按需填充 根据指定数字填充重复数据

由于公司启用了新标签,现在需要根据盘点产品数重新打印指定数量的标签。比如冰箱4台,洗衣机2台,那么就要在D2:D5数据区域复制4个重复的冰箱品名、2个重复的洗衣机品名,以此类推(图1)。手动复制容易出...

那些可以替代VLOOKUP的函数们!

大家好,今天我们来讲讲那些和VLOOKUP功能一样的函数们,但是却没有VLOOKUP函数那么有名气,所有总是嫉妒VLOOKUP函数。VLOOKUP函数大家肯定都很熟悉了。VLOOKUP函数是一个查询类...

VLOOKUP跨表查找,你会吗?

VLOOKUP跨表查找,你会吗?VLOOKUP函数是大家最常用的查找引用函数,我们在工作中经常用它按照条件查找对应的数据,但是当数据源分散在多张工作表中时,你知道怎么跨表查找吗?今天我通过一个Exce...