如何在.pro文件中检查所选的Qt版本?

时间:2013-09-06 17:27:20

标签: qt qt4 qt5 qmake qtgui

我安装了多个版本的Qt,我需要用它们编译我的项目 使用专业文件,我在文档中找不到如何进行条件编译。

理想情况下,这就是我想要做的事情:

QT_VERSION = 5   # this can be 4, set manually

if(QT_VERSION == 5) {
   QT += widgets
}
if(QT_VERSION == 4) {
   QT += gui
}

当然,pro文件中不存在if()命令 是否有更好的方法来做同样的事情?

4 个答案:

答案 0 :(得分:22)

您可以在此处使用条件函数和范围:

QT_VERSION = 5   # this can be 4, set manually

equals(QT_VERSION, 5){
   QT += widgets
}
equals(QT_VERSION, 4) {
   QT += gui
}

但是,您需要在原始代码中注意一些事项:

  1. 没有必要明确定义Qt版本,如果您忘记在.pro文件中更改它,它会让您头疼。相反,qmake会自动为您定义变量QT_MAJOR_VERSION

  2. 在这种情况下,使用equals将起作用。但是,如下所述,equals执行字符串比较。但是,最好使用greaterThanlessThan,因为当您尝试使用Qt 6(将来的某个地方)编译代码时,代码将自动停止工作。

  3. 不需要将gui添加到QT,因为它默认包含在内。

  4. 所以,你的代码应该是:

    greaterThan(QT_MAJOR_VERSION, 4) {
        QT += widgets
    }
    

    以下是一些undocumented qmake gems

    • defined(func, type)
      

      如果定义了func,则返回true;类型必须为testreplace,以匹配defineTestdefineReplace

    • equals(var1, var)
      

      (也适用于isEqual) 如果var1等于var2(字符串比较),则返回true。

    • lessThan(var1, var2)`
      

      如果var1小于var2(作为整数),则返回true。

    • greaterThan(var1, var2)
      

      如果var1大于var2(作为整数),则返回true。

    • inFile(file, var, val)
      

      如果在指定文件中定义了变量var,则返回true。此外,它可以测试它是否具有请求的值。

    • load(string)
      

      include()CONFIG += [feature]之间的某种交叉。 load(foo)将在标准功能路径中查找名为“foo.prf”的文件,并立即执行其内容。 {。1}}中包含的功能在“.pro”文件处理完毕后最后执行。与CONFIG类似,如果找到该文件,它将返回true。

答案 1 :(得分:6)

不知道自从什么时候开始(我猜是Qt5),就有versionAtLeastversionAtMost测试功能。

用法示例:

!versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2")

P.S .:发布此答案,因为简单地使用谷歌搜索“ qmake check Qt版本”不会带来这些引用(但这篇文章会带来这种影响)。

答案 2 :(得分:4)

您可以在一行中进行检查:

equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 5) {
   QT += bluetooth
} else {
  message(Qt $$QT_VERSION Bluetooth not supported.)
}

!lessThan代表更大或相等。

答案 3 :(得分:3)

这是一个简单的测试。这就是我们在QtSerialPort中所做的以及Qt框架内的其他一些模块:

lessThan(QT_MAJOR_VERSION, 5) {
...
} else {
...
}

类似和常见的条件是:

contains(QT_MAJOR_VERSION, 5): ...

或:

greaterThan(QT_MAJOR_VERSION, 4): ...

Here你可以找到我们在那里做过的另一个QtSerialPort示例。