在不同的 qt 版本中使用相同的 qt .ui 文件

using same qt .ui files in differnt qt version

由于历史原因,我们需要保持我们的软件与 Qt 4.8 兼容。当前分支是 Qt 5.2 上的 built。

最近我一直在尝试利用一些QWidget的新功能,比如QAbstractScrollArea::setSizeAdjustPolicy。不幸的是,当我这样做时,我无法在 Qt 4.8 中编译并且 Visual Studio 产生以下错误

error C2039: 'AdjustToContents' : is not a member of 'QAbstractScrollArea'

通常,我会使用预编译器指令来调整每个版本的代码。但是,在这种情况下,我不能这样做,因为 qt designer 正在生成一个 .ui 文件,该文件会动态生成代码。

有没有办法让Qt知道我想在编译时排除.ui文件的一些节点?

当您使用 qmake 构建 uild 时,您可能会考虑以下代码段

greatherThan(QT_MAJOR_VERSION, 4) {
    FORMS += # qt 5 forms goes here
    INCLUDEPATH += # path to qt 5 forms
} else {
    FORMS += # qt 4 forms goes here
    INCLUDEPATH += # path to qt 4 forms
}

然后,考虑到这些文件被调用相同并放置在不同的、特定于版本的目录中,您应该可以轻松地在您的源文件中使用它们。

查询 QT_VERSION 的值可能使您能够对次要版本更改做出反应。因此,您应该使用 contains(...) 和一些适当的正则表达式。


我苦思冥想,但无法想出一个解决方案,即您有一个 ui 文件,该文件随使用的 Qt 版本而变化。也许你可以在你的工具链中做一些 XML 预处理...

.ui 文件只是一个 xml 文件。它由uic转换为代码。生成的代码特定于具有特定版本 Qt 的构建,您不能重复使用相同的构建目录,因此不能重复使用多个 Qt 安装的 uic 输出。 Uic 输出不应在您的源代码存储库中。

您收到的错误表明您正在将 Qt 5.6 的 uic 输出与 Qt 4 一起使用。这永远不会起作用。

相反,您应该使用 Qt 4 干净地构建您的代码,并且 uic 很可能会在未知 elements/attributes 上忽略、警告或中止。如果它确实中止,很容易修改 uic 不这样做(必须更改几行)。

如果您专业地使用 Qt,那么您已经在构建您自己维护的副本,因此修补 uic 应该是添加到您的过程中的一件微不足道的事情。