1

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

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

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

4

2 回答 2

4

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

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

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

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

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

于 2020-12-09T00:57:39.087 回答
0

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

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

于 2020-12-08T23:39:39.627 回答