Как проверить выбранную версию Qt в.файл Pro?
У меня установлено несколько версий Qt, и мне нужно скомпилировать мой проект со всеми из них.
Используя файл pro, я не смог найти в документации, как сделать условную компиляцию.
в идеале, это то, что я хотел бы сделать:
QT_VERSION = 5 # this can be 4, set manually
if(QT_VERSION == 5) {
QT += widgets
}
if(QT_VERSION == 4) {
QT += gui
}
естественно, команда if () не существует в файлах pro.
Есть ли лучший способ сделать то же самое?
3 ответов
вы можете использовать условные функции и области здесь:
QT_VERSION = 5 # this can be 4, set manually
equals(QT_VERSION, 5){
QT += widgets
}
equals(QT_VERSION, 4) {
QT += gui
}
тем не менее, есть несколько вещей, на которые вам нужно обратить внимание в исходном коде:
явное определение версии Qt не требуется, и это может заставить вас получить головную боль, если вы забыли изменить это в .pro файл. Вместо qmake автоматически определяет переменную
QT_MAJOR_VERSION
для вас.используя
equals
будет работать в этом случае. Однако, как отмечается ниже,equals
выполняет сравнение строк. Однако, лучше использоватьgreaterThan
иlessThan
потому что ваш код автоматически перестанет работать, когда вы попытаетесь скомпилировать его с Qt 6 (где-то в будущем).добавлять
gui
доQT
не требуется, так как он включен по умолчанию.
Итак, ваш код должен быть:
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
}
вот некоторые без документов qmake
камни:
-
defined(func, type)
возвращает true, если
func
определено; тип должен быть либоtest
илиreplace
в матчеdefineTest
илиdefineReplace
. -
equals(var1, var)
(также работает в качестве
isEqual
).
Возвращает true, если var1 равно var2 (сравнение строк). -
lessThan(var1, var2)`
возвращает true, если
var1
меньшеvar2
(как целое число). -
greaterThan(var1, var2)
возвращает true если
var1
большеvar2
(как целое число). -
inFile(file, var, val)
возвращает true, если переменная
var
определяется в указанном файле. Кроме того, он может проверить, имеет ли он запрошенное значение. -
load(string)
и
include()
иCONFIG += [feature]
.load(foo)
будет искать файл под названием " foo.prf " в стандартном пути к функциям и немедленно выполните его содержимое. Функции, которые содержатся внутриCONFIG
выполняются последними, после".pro " файл закончил обработку. Какinclude()
, он вернет true, если файл был найден.
Это простой тест, чтобы сделать. Это то, что мы делали в QtSerialPort а также некоторые другие модули внутри Qt framework:
lessThan(QT_MAJOR_VERSION, 5) {
...
} else {
...
}
аналогичные и общие условия:
contains(QT_MAJOR_VERSION, 5): ...
или:
greaterThan(QT_MAJOR_VERSION, 4): ...
здесь вы можете найти другой пример QtSerialPort, который мы делали там.
вы можете сделать проверки в одной строке, как это:
equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 5) {
QT += bluetooth
} else {
message(Qt $$QT_VERSION Bluetooth not supported.)
}
!lessThan
здесь означает "больше или равно".