对Qt Network
Qt 6 的改动是有意识地使框架更高效、更易用的结果。
我们尝试在每个版本中保持所有公共 API 的二进制和源代码兼容性。但为了使 Qt 成为一个更好的框架,有些改动是不可避免的。
在本专题中,我们总结了Qt Network 中的这些变化,并提供了处理这些变化的指导。
API 变化
名称不明确的重载
删除了几个含糊不清的重载函数。在QAbstractSocket 及其继承者 (QTcpSocket,QUdpSocket,QLocalSocket, 和QSslSocket) 以及QNetworkReply 中,error() 信号被 errorOccurred() 所取代。代码如
connect(socket, qOverload<QAbstractSocket::SocketError>(&QAbstractSocket::error), this, &SomeClass::errorSlot);
等代码必须改为
connect(socket, &QAbstractSocket::errorOccurred, this, &SomeClass::errorSlot);
在QSslSocket 中,返回 TLS 握手过程中遇到的错误列表的函数:
更名为 sslHandshakeErrors():
const auto tlsErrors = socket.sslHandshakeErrors();
删除了承载器管理
Qt 6 中删除了 QNetworkConfiguration 和 QNetworkConfigurationManager 类。因此,QNetworkAccessManager 的以下成员函数也被删除:
void setConfiguration(const QNetworkConfiguration &config); QNetworkConfiguration configuration() const; QNetworkConfiguration activeConfiguration() const; void setNetworkAccessible(NetworkAccessibility accessible); NetworkAccessibility networkAccessible() const; void networkSessionConnected();
QNetworkInformationQNetworkConfiguration 和 QNetworkConfigurationManager 是最初在 Qt 6.1 中引入的,旨在取代承载管理 API 的某些方面。它通过提供一个统一的 API 来工作,该 API 可订阅操作系统通知的网络变化。
QNetworkInformation::reachability在 Qt 6.1 中引入的 QNetworkAccessManager::networkAccessible() 函数取代了 QNetworkAccessManager::networkAccessible(),同时增加了有关网络可达性的更详细信息。有关详细信息,请参阅其文档。
在 Qt 6.2 中QNetworkInformation 获得了检测 captive portals 的能力。
在 Qt XML 6.3 中,QNetworkInformation 增加了QNetworkInformation::transportMedium() 和QNetworkInformation::isMetered()。
删除的枚举器
QtNetwork 中删除了几个枚举器。这包括不再支持的协议和功能的常量:
- QSsl::SslV2;
- QSsl::SslV3;
- QSsl::TlsV1SslV3;
- QNetworkRequest::SpdyAllowedAttribute;
- QNetworkRequest::SpdyWasUsedAttribute;
- QNetworkAccessManager::UnknownAccessibility;
- QNetworkAccessManager::NotAccessible;
- QNetworkAccessManager::Accessible
以及名称不符合正确命名约定的枚举器:
- QSsl::TlsV1 (QSsl::TlsV1_0 是正确的名称);
- QNetworkRequest::HTTP2AllowedAttribute (使用QNetworkRequest::Http2AllowedAttribute );
- QNetworkRequest::HTTP2WasUsedAttribute (使用QNetworkRequest::Http2WasUsedAttribute )。
QNetworkRequest::FollowRedirectsAttribute 在 Qt 6 中被移除,请参阅下面有关重定向处理的部分。
配置 QSslSocket
Qt 6 中删除了以下已废弃的函数:
QList<QSslCipher> ciphers() const; void setCiphers(const QList<QSslCipher> &ciphers); void setCiphers(const QString &ciphers); static void setDefaultCiphers(const QList<QSslCipher> &ciphers); static QList<QSslCipher> defaultCiphers(); static QList<QSslCipher> supportedCiphers(); QList<QSslCipher> ciphers() const; void setCiphers(const QList<QSslCipher> &ciphers); void setCiphers(const QString &ciphers); static void setDefaultCiphers(const QList<QSslCipher> &ciphers); static QList<QSslCipher> defaultCiphers(); static QList<QSslCipher> supportedCiphers(); bool addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString); void addCaCertificate(const QSslCertificate &certificate); void addCaCertificates(const QList<QSslCertificate> &certificates); void setCaCertificates(const QList<QSslCertificate> &certificates); QList<QSslCertificate> caCertificates() const; static bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString); static void addDefaultCaCertificate(const QSslCertificate &certificate); static void addDefaultCaCertificates(const QList<QSslCertificate> &certificates); static void setDefaultCaCertificates(const QList<QSslCertificate> &certificates); static QList<QSslCertificate> defaultCaCertificates(); static QList<QSslCertificate> systemCaCertificates();
请使用QSslConfiguration 及其成员函数来设置这些参数,例如:
auto sslConfiguration = QSslConfiguration::defaultConfiguration(); sslConfiguration.setCiphers("ECDHE-ECDSA-AES256-SHA384"); // Set other parameters here ... socket.setSslConfiguration(sslConfiguration);
更改 QNetworkAccessManager 的默认行为
重定向策略
在 Qt XML 6 中,默认重定向策略已从手动改为QNetworkRequest::NoLessSafeRedirectPolicy 。如果您的应用程序依赖于手动重定向处理(它将其槽连接到QNetworkReply::redirected 信号),则必须在创建请求时显式设置此策略:
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
HTTP/2 默认已启用
在 Qt 6QNetworkAccessManager 中,默认启用 HTTP/2 协议。根据不同的方案("https "或 "http"),QNetworkAccessManager 将使用应用层协议协商 TLS 扩展或 "协议升级 "HTTP 标头来协商 HTTP/2。如果无法协商 HTTP/2,访问管理器将退回到使用 HTTP/1.1。如果您的应用程序只能使用 HTTP/1.1,您就必须在新请求中手动禁用 HTTP/2:
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);
QNetworkAccessManager 现在可防范存档炸弹
从 Qt 6.2 开始,QNetworkAccessManager 将防止压缩文件解压为比其压缩形式大得多的文件,如果解压比超过一定的阈值,将错误地取消回复。该检查仅适用于大于一定大小的文件,可通过调用QNetworkRequest::setDecompressedSafetyCheckThreshold() 进行自定义(或通过传递 -1 禁用)。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.