【问题标题】:Qt6 and Qt5 backward compatibilityQt6 和 Qt5 向后兼容
【发布时间】:2021-03-19 22:11:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: qt5 qt6


    【解决方案1】:

    兼容性不是非黑即白的。大多数 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 中运行,那么您可以评估是否可以重构代码以提供交叉兼容的变体,或者您可以排除一些方法/classes 抽象出您所经历的不兼容更改,因此预处理器定义将集中在一个模块中,而不是散布在各处。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2011-02-06
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 2012-03-13
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多