在不同的qt版本

时间:2016-06-15 14:16:16

标签: c++ qt qt-designer

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

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

  

错误C2039:' AdjustToContents' :不是QAbstractScrollArea'

的成员

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

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

2 个答案:

答案 0 :(得分:1)

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

你得到的错误表明你正在使用Qt 5.6的uic和Qt 4的输出。这不应该有效。

相反,您应该使用Qt 4对代码进行干净的构建,并且很可能,uic可能会忽略,警告或中止未知元素/属性。如果确实中止了,那么很容易修改uic而不是这样做(必须更改几行)。

如果你专业地使用Qt,那么你已经在构建自己的副本了,所以修补uic应该是一个微不足道的事情,可以添加到你的过程中。

答案 1 :(得分:0)

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

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预处理......

相关问题