Как проверить выбранную версию 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.
Есть ли лучший способ сделать то же самое?

Ответы

Ответ 1

Здесь вы можете использовать условные функции и области:

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, если файл был найден.

Ответ 2

Это простой тест. Это то, что мы делали в QtSerialPort, а также некоторые другие модули внутри рамки Qt:

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

Аналогичные и общие условия:

contains(QT_MAJOR_VERSION, 5): ...

или

greaterThan(QT_MAJOR_VERSION, 4): ...

Здесь вы можете найти другой пример QtSerialPort, который мы там делали.