Qt 6 是努力使框架更高效,且更易于使用的结果。
为兼容每个发行的所有公共 API,我们试着维护二进制和源代码。但是,为使 Qt 成为更优框架,一些改变是不可避免的。
本主题汇总了 Qt Network 的这些变化,并提供处理它们的指导。
移除了几个有歧义的重载函数。以 errorOccurred() 替换 error() 信号在 QAbstractSocket 及其继承者 ( QTcpSocket , QUdpSocket , QLocalSocket ,和 QSslSocket ),和在 QNetworkReply 。代码譬如:
connect(socket, qOverload<QAbstractSocket::SocketError>(&QAbstractSocket::error), this, &SomeClass::errorSlot);
因此必须改为:
connect(socket, &QAbstractSocket::errorOccurred, this, &SomeClass::errorSlot);
在 QSslSocket , the function that returns a list of errors encountered during the TLS handshake:
QList<QSslError> sslErrors() const;
被重命名为 sslHandshakeErrors():
const auto tlsErrors = socket.sslHandshakeErrors();
类 QNetworkConfiguration 和 QNetworkConfigurationManager 在 Qt 6 被移除。因此,下列成员函数对于 QNetworkAccessManager 也被移除:
void setConfiguration(const QNetworkConfiguration &config); QNetworkConfiguration configuration() const; QNetworkConfiguration activeConfiguration() const; void setNetworkAccessible(NetworkAccessibility accessible); NetworkAccessibility networkAccessible() const; void networkSessionConnected();
QNetworkInformation , initially introduced in Qt 6.1, aims to replace some aspects of the bearer management API. It works by providing a unified API which subscribes to changes to the network as notified by the operating system.
QNetworkInformation::reachability (), introduced in Qt 6.1, replaces the QNetworkAccessManager::networkAccessible() function, while adding more detailed information about the reachability of the network. See its documentation for more details.
在 Qt 6.2 QNetworkInformation 获得检测俘虏传送门的能力。
在 Qt 6.3 QNetworkInformation 获得 QNetworkInformation::transportMedium () 和 QNetworkInformation::isMetered ().
几个枚举器被移除在 QtNetwork . This includes constants for no longer supported protocols and functionality:
and enumerators whose names did not follow proper naming conventions:
QNetworkRequest::FollowRedirectsAttribute 在 Qt 6 被移除,见 处理重定向的有关章节 下文。
以下弃用功能在 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 and its member functions to set these parameters, e.g.:
auto sslConfiguration = QSslConfiguration::defaultConfiguration(); sslConfiguration.setCiphers("ECDHE-ECDSA-AES256-SHA384"); // Set other parameters here ... socket.setSslConfiguration(sslConfiguration);
在 Qt 6,默认重定向策略已从手动改为 QNetworkRequest::NoLessSafeRedirectPolicy . If your application relies on manual redirect handling (it connects its slot to the QNetworkReply::redirected signal), you have to explicitly set this policy when creating a request:
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
在 Qt 6 中 QNetworkAccessManager 默认启用 HTTP/2 协议。从属方案 (https 或 http), QNetworkAccessManager will use the Application Layer Protocol Negotiation TLS extension or "protocol upgrade" HTTP header to negotiate HTTP/2. If HTTP/2 cannot be negotiated, the access manager will fall back to using HTTP/1.1. If your application can only use HTTP/1.1, you have to disable HTTP/2 manually on a new request:
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);
从 Qt 6.2 开始 QNetworkAccessManager will guard against compressed files that decompress to files which are much larger than their compressed form by erroring out the reply if the decompression ratio exceeds a certain threshold. This check is only applied to files larger than a certain size, which can be customized (or disabled by passing -1) by calling QNetworkRequest::setDecompressedSafetyCheckThreshold ().