Как проверить выбранную версию 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
}

тем не менее, есть несколько вещей, на которые вам нужно обратить внимание в исходном коде:

  1. явное определение версии Qt не требуется, и это может заставить вас получить головную боль, если вы забыли изменить это в .pro файл. Вместо qmake автоматически определяет переменную QT_MAJOR_VERSION для вас.

  2. используя equals будет работать в этом случае. Однако, как отмечается ниже,equals выполняет сравнение строк. Однако, лучше использовать greaterThan и lessThan потому что ваш код автоматически перестанет работать, когда вы попытаетесь скомпилировать его с Qt 6 (где-то в будущем).

  3. добавлять 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 здесь означает "больше или равно".