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

How to check the selected version of Qt in a .pro file?

提问人:Pietro 提问时间:9/7/2013 最后编辑:László PappPietro 更新时间:9/16/2022 访问量:28401

问:

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

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

QT_VERSION = 5   # this can be 4, set manually

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

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

、qt4、qt5 qmake 、qtgui

评论

1赞 brunocodutra 9/7/2013
CMake 会是一种选择吗?
1赞 Pietro 9/7/2013
我总是尽可能使用 cmake。恐怕不是这样。

答:

32赞 Nemanja Boric 9/7/2013 #1

您可以在此处使用条件函数和作用域:

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

  3. 不需要添加到 ,因为它是默认包含的。guiQT

因此,您的代码应该是:

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

以下是一些未记录的 qmake gem:

  • defined(func, type)
    

    如果已定义,则返回 true;type 必须是 或 ,以匹配 或 。functestreplacedefineTestdefineReplace

  • equals(var1, var)
    

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

  • lessThan(var1, var2)`
    

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

  • greaterThan(var1, var2)
    

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

  • inFile(file, var, val)
    

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

  • load(string)
    

    和 之间的交叉。 将在标准功能路径中查找名为“FOo.PRF”的文件,并立即执行其内容。在“.pro”文件完成处理后,最后执行其中包含的功能。Like ,如果找到文件,它将返回 true。include()CONFIG += [feature]load(foo)CONFIGinclude()

5赞 László Papp 9/7/2013 #2

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

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

类似和常见的情况是:

contains(QT_MAJOR_VERSION, 5): ...

艺术

greaterThan(QT_MAJOR_VERSION, 4): ...

在这里,你可以找到另一个我们一直在做的QtSerialPort示例。

10赞 ephemerr 5/28/2018 #3

您可以在一行中进行检查,如下所示:

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

!lessThan那里代表更大或相等。

10赞 Youw 10/7/2018 #4

从 Qt 5.10 开始,有 versionAtLeastversionAtMost 测试函数。

使用示例:

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

PS:发布这个答案,因为简单的谷歌搜索“qmake check Qt version”不会带来这些参考(但这篇文章会带来)。

评论

4赞 FourtyTwo 1/8/2019
至少需要Qt 5.10。看这里: github.com/qt/qtbase/commit/...