Qt5与Qt6的详细区别
一、QtCore
| Qt5 | Qt6 | |
| QHash,QSet QMultiHash | qHash 函数的返回值和可选的第二个参数的类型是uint 。 uint qHash(MyType x, uint seed) | qHash 函数的返回值和可选的第二个参数的类型是size_t , size_t qHash(MyType x, size_t seed); QHash::insertMulti 被删除 |
| QVector、QList | QVector 和QList 是独立的类 | 它们被统一了, QList 是实际实现的类 QList的fromVector() 和 toVector() 以及QVector 的 fromList() 和 toList() 不再涉及数据复制 |
| 视图类 | 新增QStringView ,QByteArrayView QUtf8StringView 和QAnyStringView | |
| QRecursiveMutex 不再继承自QMutex 。 QMutex::RecursionMode 枚举已被移除,而QMutexLocker 现在是一个模板类,可同时在QMutex 和QRecursiveMutex 上运行 | ||
| 已禁用 从 | ||
| IO 类 | 通过将单个命令字符串拆分为程序名称和参数来解释该字符串的QProcess::start() 重载已更名为QProcess::startCommand() | |
| 元类型系统 |
| |
| 正则表达式类 | QRegExp 类型已退役至 Qt5Compat 模块,Qt6使用QRegularExpression 来代替QRegExp | |
| QEvent 和子类 | QEvent 子类的复制构造函数和赋值操作符已被保护起来,以防止隐式复制。使用clone ()来实现复制事件 | |
| 序列化类 | 用于将其转换为/从 Qt 传统 JSON 二进制格式的QJsonDocument 方法被移除,转而使用标准化的 CBOR 格式。Qt JSON 类型可转换为 Qt CBOR 类型,而 Qt CBOR 类型又可序列化为 CBOR 二进制格式,反之亦然。例如,请参见QCborValue::fromJsonValue() 和QCborValue::toJsonValue()。 如果您仍然需要使用二进制 JSON 格式,可以使用 Qt5Compat 模块中提供的替换。您可以在QBinaryJson 命名空间中找到它们 | |
| 使用 Qt5Compat 模块 | QT += core5compat | PUBLIC_LIBRARIESQt::Core5Compat |
二、QtGui
| Qt5 | Qt6 | |
| 内核类-QBitmap | 不再支持从QPixmap 隐式构建QBitmap 。构造函数和赋值运算符已被明确并标记为废弃。请使用新的静态工厂函数fromPixmap | |
| 内核类-QCursor | 不再支持从QPixmap 隐式构造QCursor | |
| 内核类-QKeyCombination | 一个新类,用于存储键与可选修饰符的组合。该类可替代Qt::Key 枚举中的值,以类型安全的方式与修饰符相结合 | |
| 文本类-QFontDatabase | const QStringList fontFamilies = QFontDatabase().families(); | 现在只有静态成员函数。构造函数已被弃用 const QStringList fontFamilies = QFontDatabase::families(); |
三、Qt网络
| Qt5 | Qt6 | |
| 名称不明确的重载 | | 在QAbstractSocket 及其继承者以及QNetworkReply 中,error() 信号被 errorOccurred() 所取代 connect(socket, &QAbstractSocket::errorOccurred, this, &SomeClass::errorSlot); |
| 删除了承载器管理 | 删除了 QNetworkConfiguration 和 QNetworkConfigurationManager 类 | |
| 配置 QSslSocket | auto sslConfiguration = QSslConfiguration::defaultConfiguration();
sslConfiguration.setCiphers("ECDHE-ECDSA-AES256-SHA384");
socket.setSslConfiguration(sslConfiguration); | |
| 更改 QNetworkAccessManager 的默认行为 | 默认重定向策略已从手动改为QNetworkRequest::NoLessSafeRedirectPolicy QNetworkAccessManager 默认启用 HTTP/2 协议。根据不同的方案("https "或 "http"),QNetworkAccessManager 将使用应用层协议协商 TLS 扩展或 "协议升级 "HTTP 标头来协商 HTTP/2。如果无法协商 HTTP/2,访问管理器将退回到使用 HTTP/1.1。如果您的应用程序只能使用 HTTP/1.1,您就必须在新请求中手动禁用 HTTP/2 |
四、QtQML
| Qt5 | Qt6 | |
| URL 解析 | url 通常是直接解析的 property url imageFolder: "./images" | URL 保持相对,只有在需要时才会被解析如果您依赖于旧的行为,可以使用Qt.resolvedUrl property url imageFolder: Qt.resolvedUrl("./images") |
| 变量属性 | variant 属性,自 Qt 5 起已被标记为过时,现在的处理方式与var 属性完全相同。依赖于赋值给变量属性时触发的隐式字符串转换的代码应更新为显式创建一个正确类型的对象。 property variant myColor: Qt.color("red") | |
| 已更改的 API | QQmlListProperty的CountFunction 和AtFunction 已改为使用qsizetype 而不是int | |
| 删除的 API | 1.获取引用的QQmlListProperty 构造函数已被删除 QQmlListProperty<QObject>(owner, &owner->objectList); 2.函数 qmlDebug,qmlInfo,qmlWarning,qmlContext 和qmlEngine 曾经同时存在于全局命名空间qmlRegisterType 已删除不带参数的重载。请使用qmlRegisterAnonymousType 代替,或使用QML_ANONYMOUS 切换到声明式类型注册。QQmlEngine *engine = qmlEngine(qmlObject); 3. qmlRegisterExtendedType 和qmlRegisterInterface 中没有版本参数的重载已被删除。请使用提供版本的重载,或改用QML_EXTENDED 和QML_INTERFACE 进行声明式类型注册。 |
五、QtQuick
| Qt5 | Qt6 | |
| 更改了 font.weight 的类型 | font.weight: "Bold" | ont.weight 的类型已更改为int font.weight: Font.Bold |
| FontLoader 的 | 可写的 | 是一个只读属性 |
| OpenGLInfo QML 类型 | OpenGLInfo 已被弃用 | 在 Qt 6 中被移除。请使用GraphicsInfo 代替 |
| 着色器 | 1.与custom materials 一样,不再以 GLSL 着色器字符串的形式指定效果 2.着色器效果源属性现在是 URL | |
| QQuickItem | geometryChanged() 函数更名为geometryChange() | |
| QQuick* 应用程序接口的更改 | 1.希望集成自己的 Vulkan、Metal 或 Direct3D 渲染命令集的应用程序应注意除QQuickWindow::beforeRendering() 和 afterRendering() 之外的新QQuickWindow 信号。仅连接到 beforeRendering 或 afterRendering 的现有 Qt 5 模式通常已不能满足需要,可能需要连接到其他信号(如beforeRenderPassRecording() 或afterRenderPassRecording() )作为补充。 2.依赖QQuickWindow::beforeRendering() 或 afterRendering() 信号发布自己的 OpenGL 渲染命令集的应用程序,应在调用 OpenGL 之前调用QQuickWindow::beginExternalCommands() ,在调用之后调用QQuickWindow::endExternalCommands() 。这样可以确保应用代码所做的状态更改不会导致场景图渲染器自身缓存状态的混乱。但请注意,就像在 Qt XML 5 中一样,更改Qt Quick 渲染器未使用的 OpenGL 3.x 或 4.x 状态仍会导致意外问题,因此建议应用程序在从连接到这些信号的槽或 lambdas 返回之前,将任何此类 OpenGL 状态重置为默认值。 3.删除了现有的QQuickWindow::setRenderTarget() 重载和相关的获取器,取而代之的是一个接收QQuickRenderTarget 的新函数。现在,结合QQuickRenderControl 执行重定向渲染的应用程序应使用这个新函数,以一种与 OpenGL 无关的方式指定渲染目标。 4.接收QSGRendererInterface::GraphicsApi 参数的QQuickWindow::setSceneGraphBackend() 重载已更名为setGraphicsApi()。 5.QQuickWindow 函数 setPersistentOpenGLContext 和 isPersistentOpenGLContext 已重命名,现在分别是QQuickWindow::setPersistentGraphics() 和QQuickWindow::isPersistentGraphics()。 6.setClearBeforeRendering() 和 clearBeforeRendering() 已从QQuickWindow 中删除。Qt XML 6 中没有跳过颜色缓冲区清除的选项。在 Qt 5 中,调用 setClearBeforeRendering() 常常需要与底层结合使用,以防止Qt Quick 清除渲染到颜色缓冲区中的内容。在 Qt 6 中,有一种更稳健的方法:连接到beforeRenderPassRecording() 信号,该信号会在清除后但在渲染Qt Quick'内容之前发出。 7.QQuickWindow::openglContext() 函数已被删除。当应用程序确保场景图使用 OpenGL 进行渲染时,就可以从QSGRendererInterface::getResource() 中查询QOpenGLContext 。 8.已移除 QQuickWindow::openglContextCreated() 信号。 9.已移除过时的 QQuickWindow::createTextureFromId() 函数。取而代之,使用来自 QPlatformInterface::QSGOpenGLTexture、QPlatformInterface::QSGVulkanTexture、QPlatformInterface::QSGD3D11Texture 或 QPlatformInterface::QSGMetalTexture 的 fromNative() 函数。 10.QQuickFramebufferObject 类的 API 不变,但只有在使用 OpenGL 渲染场景图时才起作用。在使用其他图形 API(如 Vulkan 或 Metal)时,该类将不起作用。依赖QQuickFramebufferObject 的应用程序应在其 main() 函数中调用QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL) ,强制使用 OpenGL。 11.QQuickRenderControl 在《OpenGL.NET》中,API 稍有改动:现在已移除 grab(),在适用情况下使用QQuickWindow::grabWindow() 代替。初始化()函数不再使用QOpenGLContext 。应用程序现在还需要酌情调用QQuickRenderControl::beginFrame() 和QQuickRenderControl::endFrame()。当需要进行多重采样时,必须调用新函数QQuickRenderControl::setSamples() 来指示采样次数。 12.希望结合现有本地图形设备或上下文对象执行Qt Quick 渲染的应用程序必须使用新的QQuickWindow::setGraphicsDevice() 函数,因为QQuickRenderControl 不再提供initialize(QOpenGLContext*) 函数。 13.将QQuickPaintedItem 和Context2D 设置为Framebuffer 模式没有任何作用。其行为与将模式设置为默认图像模式相同。 14.环境变量QSG_NO_DEPTH_BUFFER,建议通过在QQuickGraphicsConfiguration 上调用setDepthBufferFor2D() 来替代其用法,然后将其与QQuickWindow 关联。 | |
| QSG* 应用程序接口的更改 | 1.QSGMaterialShader 的接口发生了变化。实现不应再依赖 OpenGL,也不能假定函数(如现已删除的 updateState())是以QOpenGLContext current 调用的。在面向数据的新界面中,updateState() 被updateUniformData(),updateSampledImage() 和updateGraphicsPipelineState() 所取代。现在,着色器不再以字符串形式提供 GLSL 着色器代码,而是由 QtShader Tools 模块中的工具(如qsb 命令行工具)进行预处理,从而确保着色器资产在运行时无论使用哪种图形 API(Vulkan、Metal、OpenGL 或 Direct 3D)都能使用。 2.已移除 QSGEngine。如果应用程序不太可能使用该类,建议移植到QQuickRenderControl 。 3.QSGAbstractRenderer 不再是公共类。该类只有与 QSGEngine 结合使用才有意义,随着该类的删除,QSGAbstractRenderer 已转回私有。 4.QSGSimpleMaterial 方便类已被删除。应用程序应使用修订后的独立于 OpenGL 的QSGMaterial API。 4.要访问QSGTexture 的底层本地纹理对象,不再使用 textureId()。取而代之的是使用 QSGTexture::platformInterface() 和 QPlatformInterface::QSGOpenGLTexture、QPlatformInterface::QSGVulkanTexture、QPlatformInterface::QSGD3D11Texture 或 QPlatformInterface::QSGMetalTexture。 5.QSGImageNode 的子类必须覆盖新的附加虚函数,如 setAnisotropyLevel() 和 anisotropyLevel()。 6.QSGTexture 的子类可能需要重新设计。一些特定于 OpenGL 的虚函数(如 bind() 或 updateBindOptions())已不复存在,而一些新的虚函数则必须实现,如comparisonKey()。 | |
| OpenGL 使用中的变化Qt Quick | OpenGL 不再总是Qt Quick 渲染的默认选择。除非使用software 后端,否则Qt Quick 应用程序可以在运行时使用 OpenGL、Vulkan、Metal 或 Direct3D 11。如果没有通过QSG_RHI_BACKEND 环境变量或QQuickWindow::setSceneGraphBackend() 函数提出明确请求,则Qt Quick 会选择特定平台的默认值 |
六、Qt工具
| Qt5 | Qt6 | |
| QWidget 类 | 虚拟QWidget::enterEvent() 处理程序现在接收一个包含指针位置信息的QEnterEvent* 参数,而不是简单的QEvent* | |
| QDesktopWidget 和 QApplication::desktop() | QDesktopWidget 在 Qt 5 中已被弃用 | 在 Qt 6 中与 QApplication::desktop() 一起被移除。 QScreen 提供了查询可用屏幕、组成虚拟桌面的屏幕以及屏幕几何形状等信息的同等功能。 使用QWidget::setScreen() 可在特定显示屏上创建QWidget ;请注意,这并不能将部件移动到虚拟桌面设置中的屏幕上 |
| QAction、QActionGroup | 类已移入QtGui 模块。依赖于QtWidgets 中定义的类型(如QAction::menu() 和QAction::setMenu() )的成员函数将作为模板实现,只有在调用时才会实例化 | |
| 删除了QAbstractButton::animateClick() 的默认超时参数,以便使用现代连接语法,而无需使用qOverload | ||
| QComboBox 类 | QComboBox::setModel() 函数现在是虚拟的 | |
| QDateTimeEdit 类 | 当QDateTimeEdit::setDateTime() 被调用时,如果日期时间的时间规格与QDateTimeEdit 实例的时间规格不一致,日期时间将被转换为QDateTimeEdit 的时间规格。这样,日期时间就能描述相同的时间瞬间,但所使用的术语与QDateTimeEdit 使用的术语相同。在此之前,传递的日期时间中的日期和时间与 widget 的时间规格相结合,而忽略了日期时间的时间规格;这可能会描述与传递的日期时间所描述的时间点不同的时间点。 | |
| QAbstractItemView 类 | 以前返回QStyleOptionViewItem 对象的虚拟 viewOptions() 方法已更名为 initViewItemOption,该方法将初始化一个通过指针传入的QStyleOptionViewItem 对象 | |
| 通过 widget 的属性为其设计样式 | 在 Qt 5 中,此类属性的选择器值是枚举值的整数等价物 | 在 Qt 6 中则使用字符串值 |
| 实用工具类 | QUndoCommand、QUndoStack 和 QUndoGroup 撤消/重做框架中与部件无关的类已移入QtGui 模块 |
