Qt6 和 Qt5 向后兼容性

Igo*_*hik 2 qt5 qt6

假设我有 Qt5 项目。Qt6 已发布,我想将我的项目转移到它,但我也希望有可能使用 Qt5 构建我的项目。我知道 Qt5 API 与 Qt6 不兼容。所以我的问题是 Qt6 API 向后兼容 Qt5 API 吗?如果我解决了使用 Qt6 构建的所有问题,项目是否会使用 Qt5 构建?

例如,在 Qt6 中没有QVBoxLayout::setMargin()方法,但存在QLayout::setContentsMargins()。这意味着本例中的 Qt6 向后兼容 Qt5。

但是是否存在向后兼容 Qt5 的水下石头呢?

Rei*_*ica 5

兼容性并不是非黑即白的。大多数 Qt 5 代码(就代码行数而言)与 Qt 6 兼容,但您可能使用的某些特定构造则不兼容。这不会自动使事情变得“不兼容”,因为您可能可以使用其他可以在 Qt 5 和 Qt 6 中工作的构造。此外,任何特定项目遇到的不兼容程度在很大程度上取决于项目的范围、设计的惯用性等。

  1. 在当前的 Qt 5 项目中,将QT_DISABLE_DEPRECATED_BEFORE=0x060000定义添加到项目中。这将禁用您可能正在使用的所有过时的 API。我想您将需要修复几个错误。阅读 Qt 6 中可能提供的代码迁移工具。这是一个准备步骤:它不会使您的代码与 Qt 5 不兼容,它只会禁用 Qt 6 中删除的 Qt 5 的所有部分,但是有可在 Qt 5 和 Qt 6 中工作的交叉兼容替代方案。

  2. 然后,在Qt 6下构建项目,看看有什么问题。您的 qmake 项目文件不需要更改(很可能),但如果您使用 cmake,则需要在 CMakeLists.txt 中选择 Qt 6。

  3. 首先以最简单的方式解决问题 - 使用预处理器条件 - 您希望只需要处理少数需要这样做的地方。

  4. 现在您已经有了一个可以在 Qt 5 和 Qt 6 中构建并且希望主要在 Qt 5 和 Qt 6 中工作的项目,您可以评估是否可以重构代码以提出交叉兼容的变体,或者您可以提取一些方法/类抽象出您经历的不兼容的更改,因此预处理器定义将集中在一个模块中,而不是分散在各处。