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

主宰稳场 提交于 2019-11-30 04:48:13
Nemanja Boric

You can use conditional functions and scopes here:

QT_VERSION = 5   # this can be 4, set manually

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

However, there are a few things that you need to pay attention to in your original code:

  1. Explicitly defining the Qt version is not necessary, and it can make you get a headache if you forgot to change that in the .pro file. Instead, qmake automatically defines a variable QT_MAJOR_VERSION for you.

  2. Using equals will work in this case. However, as noted below, equals performs a string comparison. However, it is better to use greaterThan and lessThan because your code will automatically stop working when you try to compile it with Qt 6 (somewhere in the future).

  3. Adding gui to the QT is not needed, as it is included by default.

So, your code should be:

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

Here are some undocumented qmake gems:

  • defined(func, type)
    

    Returns true if func is defined; type must be either test or replace, to match defineTest or defineReplace.

  • equals(var1, var)
    

    (also works as isEqual).
    Returns true if var1 is equal to var2 (string comparison).

  • lessThan(var1, var2)`
    

    Returns true if var1 is less than var2 (as an integer).

  • greaterThan(var1, var2)
    

    Returns true if var1 is greater than var2 (as an integer).

  • inFile(file, var, val)
    

    Returns true if a variable var is defined in the specified file. Additionally, it can test to see if it has the requested value.

  • load(string)
    

    Something of a cross between include() and CONFIG += [feature]. load(foo) will look for a file called "foo.prf" in the standard feature path, and execute its contents immediately. Features that are contained within CONFIG are executed last, after the ".pro" file has finished processing. Like include(), it will return true if the file was found.

Not sure since when (Qt5 I guess), there is versionAtLeast and versionAtMost test functions.

Usage example:

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

P.S.: Posting this answer, since simple googling "qmake check Qt version" doesn't brings these references (but this post does).

You can make checks in one line like this:

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

!lessThan there stands for greater or equal.

This is a simple test to do. This is what we have been doing in QtSerialPort and also some other modules inside the Qt framework:

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

Similar and common conditions are:

contains(QT_MAJOR_VERSION, 5): ...

or:

greaterThan(QT_MAJOR_VERSION, 4): ...

Here you can find another QtSerialPort example we have been doing in there.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!