Qt6 和 Qt5 向后兼容

Qt6 and Qt5 backward compatibility

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

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

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

简短的回答是否定的,Qt6 不向后兼容 Qt5。例如,与事件系统不同...

在 Qt5 中是 QWidget::enterEvent( QEvent * ),而在 Qt 6 中是 QWidget::enterEvent( QEnterEvent * )...

兼容性不是非黑即白的。大多数 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,则需要 select Qt 6 in the CMakeLists.txt。

  3. 首先以最简单的方式解决问题 - 使用预处理器条件 - 希望您只需要处理几个有必要的地方。

  4. 现在您已经有了一个可以在 Qt 5 和 Qt 6 中构建并希望大部分都可以工作的项目,您可以评估是否可以重构代码以提供交叉兼容的变体,或者也许您可以提取出一些 methods/classes 来抽象出您经历过的不兼容更改 ,这样预处理器定义将集中在一个模块中,而不是散布在各处。