qtc - ¿Cómo verificar la versión seleccionada de Qt en un archivo.pro?
qt largo causas (4)
Tengo varias versiones de Qt instaladas y necesito compilar mi proyecto con todas ellas.
Usando un archivo pro, no pude encontrar en la documentación cómo hacer una compilación condicional.
Idealmente, esto es lo que me gustaría hacer:
QT_VERSION = 5 # this can be 4, set manually
if(QT_VERSION == 5) {
QT += widgets
}
if(QT_VERSION == 4) {
QT += gui
}
Naturalmente, el comando if () no existe en los archivos pro.
¿Hay una mejor manera de hacer lo mismo?
Esta es una prueba simple para hacer Esto es lo que hemos estado haciendo en QtSerialPort y también algunos otros módulos dentro del marco Qt:
lessThan(QT_MAJOR_VERSION, 5) {
...
} else {
...
}
Las condiciones similares y comunes son:
contains(QT_MAJOR_VERSION, 5): ...
o:
greaterThan(QT_MAJOR_VERSION, 4): ...
Here puede encontrar otro ejemplo de QtSerialPort que hemos estado haciendo allí.
No estoy seguro desde cuándo (supongo que en Qt5), existen las funciones de prueba versionAtLeast y versionAtLeast .
Ejemplo de uso:
!versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2")
PD: Publicando esta respuesta, ya que el simple Google "qmake check Qt version" no trae estas referencias (pero esta publicación sí).
Puedes hacer cheques en una línea como esta:
equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 5) {
QT += bluetooth
} else {
message(Qt $$QT_VERSION Bluetooth not supported.)
}
!lessThan
ahi significa mayor o igual.
Puedes usar funciones y ámbitos condicionales aquí:
QT_VERSION = 5 # this can be 4, set manually
equals(QT_VERSION, 5){
QT += widgets
}
equals(QT_VERSION, 4) {
QT += gui
}
Sin embargo, hay algunas cosas a las que debe prestar atención en su código original:
Definir explícitamente la versión de Qt no es necesario, y puede provocarle un dolor de cabeza si olvidó cambiar eso en el archivo .pro. En su lugar, qmake define automáticamente una variable
QT_MAJOR_VERSION
para ti.El uso de
equals
funcionará en este caso. Sin embargo, como se indica a continuación,equals
realiza una comparación de cadena. Sin embargo, es mejor usargreaterThan
ylessThan
porque su código dejará de funcionar automáticamente cuando intente compilarlo con Qt 6 (en algún lugar en el futuro).No es necesario agregar
gui
alQT
, ya que se incluye de forma predeterminada.
Por lo tanto, su código debe ser:
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
}
Aquí hay algunas gemas indocumentadas qmake
:
defined(func, type)
Devuelve true si se define
func
; el tipo debe sertest
oreplace
, para que coincida condefineTest
odefineReplace
.equals(var1, var)
(También funciona como
isEqual
).
Devuelve verdadero si var1 es igual a var2 (comparación de cadenas).lessThan(var1, var2)`
Devuelve verdadero si
var1
es menor quevar2
(como un entero).greaterThan(var1, var2)
Devuelve verdadero si
var1
es mayor quevar2
(como un entero).inFile(file, var, val)
Devuelve verdadero si se define una variable
var
en el archivo especificado. Además, puede probar si tiene el valor solicitado.load(string)
Algo de una cruz entre
include()
yCONFIG += [feature]
.load(foo)
buscará un archivo llamado "foo.prf" en la ruta de la característica estándar y ejecutará su contenido inmediatamente. Las funciones contenidas enCONFIG
se ejecutan en último lugar, después de que el archivo ".pro" haya terminado de procesarse. Al igual queinclude()
, devolverá true si se encontró el archivo.