I have multiple versions of Qt installed, and I need to compile my project with all of them.
Using a pro file, I could not find in the documentation how to do a conditional compilation.
Ideally, this is what I would like to do:
QT_VERSION = 5 # this can be 4, set manually if(QT_VERSION == 5) { QT += widgets } if(QT_VERSION == 4) { QT += gui }
Naturally, the if() command does not exist in pro files.
Is there a better way to do the same thing?
Qt Creator automatically detects the Qt versions that are registered by your system or by installers. To view detailed information for each Qt version, select it in the list and select Details in the Qt version for section. To add Qt versions, select Tools > Options > Build & Run > Qt Versions.
pro) File. I'm sure you already know about the Qt Project File since we have mentioned it countless times throughout the book. A .pro file is actually the project file used by qmake to build your application, library, or plugin.
That being said, under a Linux system we can simply use the following script to determine whether Qt is installed: if ! test -x /usr/bin/qmake then # The Qt library is missing... echo "error: This script requires Qt to be installed." exit 1 fi # The Qt library is installed ...do your thing...
In the Qt Creator application, choose menu File->Open File or Project, navigate to the project folder and choose the . pro file to open.
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:
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.
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).
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With