八年了Qt6终于来啦!Qt Network模块发生重大更改

本文介绍了Qt6中网络模块的重要更新,包括QNetworkAccessBackend的改进、HTTP/2协议的支持变化、重定向策略的调整等内容。此外,还讨论了TLS1.3协议的未来计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt最新试用版>>

点击获取更多文章教程

Qtitan组件集

  • QtitanRibbon下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 : 是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面操作系统。
  • QtitanDataGrid下载试用 : 适用于Qt的商业化DataGrid 组件,使得表格数据可以直接面向终端用户完全集成了QtDesigner,极易适应其他相似开发环境,保证100%兼容Qt GUI。

在本文中,我们想告诉您Qt Network模块在Qt 6中的一些最新更新和更改以及一些潜在的发展。

QNetworkAccessBackend

QNetworkAccessBackend是一个抽象基类,用于与我们的缓存,文件和ftp后端接口。我们已经在Qt中使用QNetworkAccessBackend已有一段时间了,但是不可能以任何合理的方式在Qt网络外部使用。对于Qt 6,我们计划将ftp后端移出Qt Network,并作为插件单独分发。为此,我们使QNetworkAccessBackend在外部使用起来更加友好,并使QNetworkAccessManager能够在运行时加载这些插件。与我们的某些其他插件接口一样,它没有Qt本身具有的严格的向后兼容性保证,并且需要链接到QtNetworkPrivate才能使用它。

我们希望能够专门化各种后端的行为。例如,非网络后端不需要我们为目标URL准备代理列表。为此,我们添加了三个不同的枚举,每个枚举中都有一些值:

  • TargetType
  • 安全功能
  • IO功能

其中,仅需要“ TargetType”指定后端支持的目标是联网的还是本地的。

如果某些功能无法使用,则某些功能可能无法启用。一个这样的例子是IO功能“ZeroCopy”,它启用函数readPointer()和advanceReadPointer()。如果未启用,则不会调用这两个函数。拥有这个特性系统的主要思想是我们可以在不破坏任何现有代码的情况下进行这些改进。新代码必须选择使用新功能。不过,重申一下:我们不能保证网络访问后端插件与使用Qt的应用程序具有相同的向后兼容性。

要实现网络访问后端插件,您需要实现一个从QNetworkAccessBackendFactory继承的类。如果支持所请求的方案,则此类将完成创建后端的工作。您还需要创建一个从QNetworkAccessBackend继承的类,并覆盖所有纯虚函数以及'read()'或'readPointer()'和'advanceReadPointer()'(如果您的类支持'ZeroCopy'功能) 。对于现有用途,QNetworkAccessCacheBackend和QNetworkAccessFileBackend均已更新为使用新接口,尽管它们直接编译为Qt而不是作为插件分发。

通讯协定

在Qt 6中,我们放弃了SPDY支持。SPDY是具有开放规范的实验性协议,主要由Google开发。SPDY成为HTTP / 2协议的前身和原型。

在维持与HTTP / 1.1的兼容性(例如与方法,状态代码,URI和大多数标头字段)的兼容性的同时,HTTP / 2还添加了:

  • HTTP标头的数据压缩
  • 通过单个TCP连接多路复用多个请求
  • HTTP / 2服务器推送
  • 允许客户端和服务器选择HTTP / 2或HTTP / 1.1的协商机制

在Qt 6之前,必须通过设置以下属性之一来手动启用HTTP / 2协议:

  • QNetworkRequest :: Http2AllowedAttribute
  • QNetworkRequest :: Http2DirectAttribute,

例如:

request.setAttribute(QNetworkRequest::Http2AllowedAttribute, true);

对于“ Http2AllowedAttribute”,QNetworkAccessManager对“ https”方案使用应用程序层协议协商,对“ http”方案使用协议升级头“ h2c”。如果您事先知道服务器以所谓的“直接”模式支持HTTP / 2,而无需协议协商,则第二个属性很有用。

在Qt 6中,默认情况下启用HTTP / 2支持:这意味着属性'Http2AllowedAttribute'设置为'true'。如果无法协商HTTP / 2,则QNetworkAccessManager将回退到HTTP / 1.1。如果您的应用程序只能使用HTTP / 1.1,则可以为新的网络请求将属性'Http2AllowedAttribute'设置为'false':

request.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);

此“默认启用”规则有一个例外:

QNetworkAccessManager::connectToHostEncrypted(host, port, configuration); 

使用此功能,应用程序可以预连接到服务器,而无需发送任何请求。如果我们要在这样的连接上启用HTTP / 2,则该连接对于希望使用HTTP / 1.1并通过使用请求属性禁用HTTP / 2的应用程序将毫无用处。通过在“配置”参数中设置所需的协议列表,可以显式启用HTTP / 2,例如:

auto tlsConfig = QSslConfiguration::defaultConfiguration(); tlsConfig.setAllowedNextProtocols({QSslConfiguration::ALPNProtocolHTTP2}); manager.connectToHostEncrypted(host, port, tlsConfig);

默认重定向策略已更改

另一个可能影响您的网络代码的更改是QNetworkAccessManager在Qt 6中使用的默认重定向策略。该策略API最初是在Qt 5中引入的,其思想是在Qt 6中切换为默认的自动重定向处理。

QNetworkAccessManager支持几种重定向策略,由枚举QNetworkRequest :: RedirectPolicy描述。这些政策是:

  • ManualRedirectPolicy
  • NoLessSafeRedirectPolicy
  • SameOriginRedirectPolicy
  • UserVerifiedRedirectPolicy

从Qt 6开始,QNetworkAccessManager发出请求时将使用的默认重定向策略是QNetworkRequest :: NoLessSafeRedirectPolicy(该策略禁止从“ https”重定向到“ http”)。

如果您有一个应用程序,该应用程序依赖于连接到QNetworkReply :: redirected()的插槽来处理重定向,则必须使用Qt 6将策略设置为QNetworkRequest :: ManualRedirectPolicy:

req.setAttribute(RedirectPolicyAttribute, ManualRedirectPolicy);

承载管理已删除

承载管理是对过去支持漫游和管理某些设备上的连接所需的机器的名称。它还可以选择连接到internet时使用的设备网络接口。今天,这种情况已不再,因为操作系统通常会自行处理漫游,并会自动选择最佳的网络接口来发送数据,通常不会为应用程序提供影响这些选择的方法(或不方便的方式)。
尽管QNetworkManager提供了api来选择要使用的接口或配置正在使用的接口,但这一新的现实意味着当前没有支持的平台为Qt提供可靠的方式来完成请求。在随后的Wifi请求被触发后,可能会导致网络中的各种Qt请求保持高流量,从而导致网络在短时间内保持高流量。
考虑到新的现实也使得承载管理在很大程度上是多余的,我们决定是时候让Qt网络的这一部分退役了。
一个仍然有用的特性是能够检查连接并获得连接更改的通知。到目前为止,在qt6.0中还没有找到替代品,尽管我们已经收集了一些用例,并希望在接下来的小版本中有一个替代品来替代这个功能。如果您有特定的用例,您希望看到涵盖的内容,或者您想跟踪这个任务的进度,那么请转到QTBUG-86966。

QSslSocket

在Qt 6中,QSslSocket接收了一个附加的API,提供有关作为TLS协议的一部分接收或发送的警报消息的信息。:以下面为例:

  • QSsl::AlertLevel describes how serious problem is
  • QSsl::AlertType indicates the type of problem

QSslSocket中有两个新信号:

  • QSslSocket :: alertSent()
  • QSslSocket :: alertReceived()

如果可能,这些信号还会报告问题的文本描述(如果由TLS库提供)。

与TLS握手相关的另一项更改是能够在握手仍在进行时尽早报告握手期间遇到的错误的功能。这些错误直接从验证回调中报告。QSslConfiguration有一个新的getter和setter:

  • bool QSslConfiguration :: handshakeMustInterruptOnError()const;
  • void QSslConfiguration :: setHandshakeMustInterruptOnError()const;

QSslSocket有一个新信号:

  • void handshakeInterruptedOnError();

和一个错误的函数必须忽略:

  • void continueInterruptedHandshake();

如果不忽略错误,则底层TLS库将向对等方发送警报消息。

对于使用QNetworkAccessManager的应用程序,此API有点底层,并且没有太大的意义。但是,如果直接使用QSslSocket,则对于调试目的或实现某些错误或警告处理逻辑时,它可能非常方便。目前,此更改适用于我们的OpenSSL后端;我们使用的其他TLS库没有必需的API或未提供我们所需的完整信息。

TLS 1.3及更高版本

好吧,这一部分并不是关于qt6已经具备的。这也是关于未来可能的发展。到目前为止,qt6支持TLS协议的最新版本,即1.3,这要归功于我们的OpenSSL后端(qt5也支持tls1.3)。我们正致力于在Schannel后端启用tls1.3。不幸的是,SecureTransport被Apple弃用,没有可用的TLS库作为替代,只有一些构建在BoringSSL之上的更高级别的框架(请注意这一点的讽刺!)。这意味着,对于我们的达尔文用户,我们将在未来提供另一种选择。以QNetworkAccessManager为例,在苹果的NSUrlSession等类之上实现的一个新的QNetworkAccessBackend非常方便(包括tls1.3和实验性的HTTP/3支持)。

Qt最新教程资讯:(持续更新……)

如果这篇文章没能满足你的需求、点击获取更多文章教程!现在立刻下载Qt免费试用吧!

 

<think>好的,用户现在问的是“什么是QT”,我需要先明确他们指的是哪个QT。因为QT有不同的含义,常见的有两种:一个是Qt框架,另一个可能是QuickTime,但后者现在不太常见了。根据之前的对话历史,用户之前询问了C语言的八皇后问题,可能对编程相关的内容更感兴趣,所以大概率是指Qt框架。 接下来,我需要确认用户的需求。他们可能刚开始学习编程或者对GUI开发感兴趣,想了解Qt是什么,以及它的用途和特点。需要从基本定义开始,逐步深入,涵盖主要特性、应用场景、与其他框架的比较优势,以及如何开始使用等。 用户可能对跨平台开发感兴趣,特别是如果他们使用C++的话,Qt是一个重要工具。需要强调Qt的跨平台能力,模块化设计,信号与槽机制,以及丰富的库支持。此外,用户可能关心Qt的版本选择,比如开源版和商业版的区别,以及学习资源在哪里找。 还要注意用户的潜在需求,比如是否有移动应用或嵌入式开发的需求,Qt在嵌入式系统中的应用也很广泛,比如汽车仪表盘、医疗设备等。因此,在介绍时应该提到这些应用场景,帮助用户全面了解Qt的适用性。 需要避免使用过于专业的术语,保持解释的易懂性,同时提供足够的信息让用户知道Qt的强大功能。可能还需要提到Qt的历史,比如由Trolltech开发,现在由The Qt Company维护,以增加背景信息。 最后,总结Qt的优势,并给出学习建议,比如推荐官方文档和教程,帮助用户快速上手。确保回答结构清晰,分点列出,方便用户逐步理解。</think>### Qt框架详解 Qt(发音同"cute")是一套**跨平台C++图形用户界面应用程序开发框架**,由挪威Trolltech公司于1995年首次发布,现由The Qt Company维护。它不仅用于GUI开发,还提供完整的**跨平台解决方案**,涵盖从桌面到嵌入式系统的全场景开发需求。 --- #### 一、核心特性 1. **跨平台支持** - 支持Windows/macOS/Linux三大桌面系统 - 移动端覆盖Android/iOS - 嵌入式系统(如车载系统、工业控制界面) - 示例代码无需修改即可多平台编译: ```cpp QPushButton *btn = new QPushButton("Click me", this); ``` 2. **模块化架构** | 模块类别 | 核心组件 | 功能描述 | |---------------|--------------------------|----------------------------| | **GUI** | Qt Widgets/Qt Quick | 传统控件与现代QML界面开发 | | **核心** | Qt Core | 非GUI基础功能(文件/线程等)| | **网络** | Qt Network | HTTP/TCP/UDP通信支持 | | **数据库** | Qt SQL | 多数据库驱动接口 | | **多媒体** | Qt Multimedia | 音视频处理框架 | | **3D图形** | Qt 3D | OpenGL/Vulkan集成 | 3. **信号与槽机制** - 独特的**事件通信系统**(比回调函数更安全) - 示例: ```cpp connect(button, &QPushButton::clicked, this, &MainWindow::handleClick); ``` --- #### 二、技术优势对比 | 特性 | Qt | MFC | JavaFX | Electron | |-----------------|--------------|--------------|-------------|--------------| | 开发语言 | C++ | C++ | Java | JavaScript | | 内存占用 | 低(原生) | 低 | 中等 | 高(Chromium)| | 启动速度 | 毫秒级 | 毫秒级 | 秒级 | 秒级 | | 安装包大小 | 10-50MB | 依赖系统库 | 需JRE | 100MB+ | | 硬件访问能力 | 直接 | 直接 | 受限 | 受限 | --- #### 三、典型应用场景 1. **工业软件** - 西门子Teamcenter界面 - MATLAB部分模块界面 - 汽车ECU调试工具 2. **消费级软件** - Adobe Photoshop Elements - 特斯拉车载系统界面 - WPS Office Linux版 3. **嵌入式系统** - 医疗设备操作界面 - 智能家居控制面板 - 航空电子显示系统 --- #### 四、版本选择指南 1. **开源版本** - LGPLv3/GPLv3协议 - 适用于:个人开发者、学术研究、开源项目 - 限制:动态链接库需保持开源 2. **商业授权** - 闭源开发许可 - 包含:官方技术支持、专属组件(Qt Charts等) - 典型用户:宝马、AMD、西门子等企业 --- #### 五、开发环境搭建 1. **推荐工具链** ```markdown - IDE: Qt Creator(官方集成开发环境) - 编译器: * Windows: MinGW/MSVC * Linux: GCC * macOS: Clang - 构建系统: qmake/CMake ``` 2. **创建第一个窗口程序** ```cpp #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("Hello Qt!"); label.show(); return app.exec(); } ``` --- #### 六、学习路线建议 1. **基础阶段(1-2周)** - 掌握QObject对象模型 - 理解信号槽机制 - 熟悉常用Widgets(按钮/输入框/布局) 2. **进阶阶段(1个月)** - 学习QML语法: ```qml Rectangle { width: 200 height: 100 Text { text: "QML界面"; anchors.centerIn: parent } } ``` - 掌握Model/View架构 - 实现多线程通信 3. **高级应用(持续提升)** - OpenGL集成开发 - 自定义QML组件 - 跨平台部署优化 --- #### 七、资源推荐 1. **官方文档** [doc.qt.io](https://doc.qt.io/) - 包含API手册和教程 2. **经典书籍** - 《C++ GUI Qt 4编程》 - 《Qt5编程入门》 3. **社区支持** - Qt官方论坛 - Stack Overflow的`qt`标签(超过30万问题) --- Qt通过其**"Write Once, Compile Anywhere"**的特性,已成为工业级应用开发的首选框架。最新版本Qt6(2020年发布)进一步优化了性能,并增强了对Python绑定的支持(PyQt/PySide),使其在AIoT时代持续保持竞争力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值